Некоторые элементы UIMenuController можно найти в UIResponder.h в среде UIKit.
@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
Но там нет опции говорящего текста. Оказывается, если вы переопределите «canPerformAction: WithSelector:», в подклассе вашего UIWebView или UITextField, как указано ниже, вы также получите список всех действий, отправленных самому себе, включая параметры 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;
}
Вы найдете несколько методов, которые могут вас заинтересовать, в том числе _accessibilitySpeak: и _accessibilityPauseSpeaking: и _define: (обратите внимание, что эти три селектора только для iOS 5). Подчеркивание означает, что они являются частными, поэтому имейте в виду, что их нельзя напрямую вызывать с помощью классического синтаксиса [селектор классов].
Помните, что это системные элементы меню, что означает, что Apple будет размещать их перед любыми элементами меню, которые вы добавляете, часто оставляя доступ к элементам меню во втором слое, нажав на кнопку>. Если вы хотите контролировать порядок отображения элементов и / или смешивать системные элементы Apple с вашими элементами, вам необходимо создать пользовательские элементы меню для этих действий, которые вызывают метод в вашем классе, например:
- (void) myAppSpeak: (UIMenuController*) sender
{
[super performSelector:@selector(_accessibilitySpeak:)];
}
Имейте в виду, что эти методы должны быть реализованы в подклассе класса, который их уже реализует, например, в подклассе UIWebView .... не в подклассе UIWebViewController.
Затем внутри контроллера или там, где вы строите свой UIMenuController, создайте пользовательскую кнопку, которая вызывает этот метод. Убедитесь, что вы находитесь в веб-представлении, вы ссылаетесь на объект типа вашего подкласса, а не на общее веб-представление. В противном случае это не сработает.
UIMenuItem *speakMenuItem = [[UIMenuItem alloc] initWithTitle:@"Speak" action:@selector(myAppSpeak:)];
[UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:speakMenuItem, etc. etc., nil];
Даже если вы добавляете его в пункты вашего меню, оно не появится, если вы не вернете YES для селектора в вашем canPerformAction: WithSelector: в вашем подклассе веб-представления или текстового поля. Так что не стесняйтесь добавлять элементы здесь, которые могут быть косвенными в противном случае. Вы можете использовать логику в подклассе, чтобы разобраться в этом.