将语音添加到自定义UIMenuController

Eri*_*der 8 iphone ios

我在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)

任何帮助深表感谢!谢谢 - 埃里克

Mat*_*ler 8

我发现了一些有趣的东西.基本上,当启用说话选择时,在您进行第一次选择后,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.


Eri*_*der 7

一些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视图或文本字段的子类中.所以随意在这里添加可能是间接的项目.您可以在子类视图中使用逻辑对其进行排序.