我在a UIMenuController中创建了一个自定义UIWebView但它似乎摆脱了之后的"Speak Selection"选项UIMenuController.说话选择选项在所有测试设备的"首选项"中打开,并显示在其他应用程序中,包括非Apple应用程序.是否有可访问性服务或sharedMenuController我可以调用以获取此项目的一部分?
UIMenuItem *copyMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Copy", @"Copy menu item") action:@selector(myappCopy:)];
UIMenuItem *highlightMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Highlight", @"Highlight menu option") action:@selector(myappHighlight:)];
UIMenuItem *unhighlightMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Remove Highlight", @"Remove Highlight menu option")
action:@selector(myappRemoveHighlight:)];
UIMenuItem *noteMenuItem = [[UIMenuItem alloc] initWithTitle:NSLocalizedString(@"Note", @"Note menu options") action:@selector(myappNote:)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:copyMenuItem, highlightMenuItem, unhighlightMenuItem, noteMenuItem, nil];
[copyMenuItem release];
[highlightMenuItem release];
[unhighlightMenuItem release];
[noteMenuItem release];
Run Code Online (Sandbox Code Playgroud)
我甚至尝试在开始时解析现有的共享菜单项,但我没有看到任何转储在日志中.该方法将在应用启动时调用.
在方法的顶部尝试了这个:
for (UIMenuItem *menuItem in [UIMenuController sharedMenuController].menuItems) {
NSLog(@"title: %@", menuItem.title);
NSLog(@"action: %@", menuItem.action);
}
Run Code Online (Sandbox Code Playgroud)
任何帮助深表感谢!谢谢 - 埃里克
我发现了一些有趣的东西.基本上,当启用说话选择时,在您进行第一次选择后,UIMenuController将清空menuItems.解决方案虽然很简陋但很简单.
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
NSString *selectorString = NSStringFromSelector(action);
BOOL isAccessibilitySelector = [selectorString isEqualToString:@"_accessibilitySpeak:"] || [selectorString isEqualToString:@"_accessibilityPauseSpeaking:"];
if (isAccessibilitySelector && [super canPerformAction:action withSender:sender]) {
//(re)add menuItems to UIMenuController
return YES;
}
return NO;
Run Code Online (Sandbox Code Playgroud)
}
我应该注意,你必须在调用menuItems它们之后重新添加它canPerformAction...().
我已将此作为雷达提交:12931434.更新:DUP到13060693.
一些UIMenuController项可以在UIKit框架中的UIResponder.h中找到.
@interface NSObject(UIResponderStandardEditActions) // these methods are not implemented in NSObject
- (void)cut:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)copy:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)paste:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)select:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)selectAll:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_0);
- (void)delete:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_3_2);
- (void)makeTextWritingDirectionLeftToRight:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
- (void)makeTextWritingDirectionRightToLeft:(id)sender __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);
@end
Run Code Online (Sandbox Code Playgroud)
但那里没有说话文字选项.事实证明,如果您在UIWebView或UITextField的子类中覆盖"canPerformAction:WithSelector:",您将获得发送给self的所有操作的列表,包括UIMenuController选项.
// Override
- (BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
NSLog(@"%@",NSStringFromSelector(action));
//if you are customizing your menu, return NO except for your specific selectors
return YES;
}
Run Code Online (Sandbox Code Playgroud)
你会发现一些你可能感兴趣的方法,包括_accessibilitySpeak:和_accessibilityPauseSpeaking:和_define :(请注意这三个选择器只是iOS 5).下划线表示它们是私有的,因此请记住,您不能使用经典的[类选择器]语法直接调用它们.
请记住,这些是系统menuItems,这意味着Apple会将它们粘贴在您添加的任何菜单项的前面,通常会通过点击>箭头将您的菜单项留在第二层中.如果要控制项目的显示顺序和/或将Apple的系统项目与项目混合,则需要为这些在类中调用方法的操作创建自定义菜单项,如下所示:
- (void) myAppSpeak: (UIMenuController*) sender
{
[super performSelector:@selector(_accessibilitySpeak:)];
}
Run Code Online (Sandbox Code Playgroud)
请记住,这些方法需要在已实现这些方法的类的子类中实现,例如UIWebView的子类....而不是UIWebViewController的子类.
然后在控制器内部,或者在构建UIMenuController的任何地方,创建调用此方法的自定义按钮.确保您处于Web视图中,您引用的是子类类型的对象,而不是通用Web视图.否则,它将无法正常工作.
UIMenuItem *speakMenuItem = [[UIMenuItem alloc] initWithTitle:@"Speak" action:@selector(myAppSpeak:)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:speakMenuItem, etc. etc., nil];
Run Code Online (Sandbox Code Playgroud)
即使您将其添加到菜单项,也不会出现,除非您为canPerformAction中的选择器返回YES:WithSelector:在您的Web视图或文本字段的子类中.所以随意在这里添加可能是间接的项目.您可以在子类视图中使用逻辑对其进行排序.
| 归档时间: |
|
| 查看次数: |
1944 次 |
| 最近记录: |