2012-03-26 3 views
7

UIWebView에 사용자 지정 UIMenuController을 만들었지 만 그 후에 UIMenuController에서 "Speak Selection"옵션을 제거한 것으로 보입니다. 말하기 선택 옵션은 모든 테스트 장치의 환경 설정에서 켜져 있으며 비 Apple 애플 리케이션을 포함하여 다른 애플 리케이션에도 나타납니다. 접근성 서비스 또는이 항목을 가져 오기 위해 전화 할 수있는 sharedMenuController의 일부가 있습니까?사용자 지정 UIMenuController에 음성 추가

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]; 

시작 부분에 기존 공유 메뉴 항목을 구문 분석하려고 시도했지만 로그에 아무 것도 표시되지 않습니다. 메소드가 앱 실행에 호출됩니다.

는 방법의 상단이 시도 :

for (UIMenuItem *menuItem in [UIMenuController sharedMenuController].menuItems) { 
     NSLog(@"title: %@", menuItem.title); 
     NSLog(@"action: %@", menuItem.action); 
    } 

어떤 도움이 많이 감사합니다! 감사합니다 - 에릭

+0

결론 ... UIMenuController items 배열의 개수가 메서드의 시작 부분에서 0이므로 for 루프가 무의미하다는 것을 알아 냈습니다. –

+0

난 그냥 알고 싶은 사람, 기본 UIMenuController 항목에 액세스하고 메뉴 항목에 그들을 포함하는 방법을 알고 있습니까? –

+0

레이더로 제출했습니다 : 12931434. 아래 솔루션으로 앱 스토어 승인을받을 수 있었습니까? –

답변

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 

하지만 거기에는 말하기 텍스트 옵션이 없습니다. 아래 나열된 UIWebView 또는 UITextField의 하위 클래스에서 "canPerformAction : WithSelector :"를 재정의하면 밝혀지며 UIMenuController 옵션을 포함하여 self에 보낸 모든 액션 목록도 표시됩니다.

// 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 만). 밑줄은 비공개라는 것을 의미하므로 고전적인 [class selector] 구문을 사용하여 직접 호출 할 수는 없습니다.

이들은 시스템 메뉴 항목이므로 추가 한 모든 메뉴 항목 앞에 붙이기 때문에> 화살표를 눌러 메뉴 항목을 두 번째 레이어에 남겨 두는 것을 의미합니다. 항목이 표시되는 순서를 제어하고 Apple 시스템 항목을 항목과 함께 사용하려면 다음과 같이 클래스의 메서드를 호출하는 이러한 작업에 대한 사용자 지정 메뉴 항목을 만들어야합니다.

- (void) myAppSpeak: (UIMenuController*) sender 
{ 
    [super performSelector:@selector(_accessibilitySpeak:)]; 
} 

이러한 메서드는 UIWebView ....의 하위 클래스 인 UIWebViewController의 하위 클래스와 같이 이미 구현 한 클래스의 하위 클래스에서 구현해야합니다.

그런 다음 컨트롤러 또는 UIMenuController를 빌드 할 때마다이 메서드를 호출하는 사용자 지정 단추를 만듭니다. 웹보기에 있는지, 일반 웹보기가 아닌 하위 클래스 유형의 객체를 참조하는지 확인하십시오. 그렇지 않으면 작동하지 않습니다. WithSelector : 웹보기 또는 텍스트 필드의 하위 클래스에 당신이 당신의 canPerformAction의 선택을 위해 YES 반환하지 않는

UIMenuItem *speakMenuItem = [[UIMenuItem alloc] initWithTitle:@"Speak" action:@selector(myAppSpeak:)]; 

    [UIMenuController sharedMenuController].menuItems = [NSArray arrayWithObjects:speakMenuItem, etc. etc., nil]; 

당신이 당신의 메뉴 항목에 추가된다하더라도, 그것은 표시되지 않습니다. 그러므로 상황에 따라 다를 수있는 항목을 여기에 추가하십시오. 서브 클래 싱 된 뷰에서 로직을 사용하여이를 정렬 할 수 있습니다.

7

이 버그로 인해 흥미로운 점을 발견했습니다. 기본적으로 말하기 선택을 사용하는 경우 첫 번째 선택을 수행하면 UIMenuControllermenuItems에서 비 웁니다. 솔루션은 해커이긴하지만 간단합니다.

- (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; 

}

난 당신이 canPerformAction...()가 호출 된 그 후 menuItems을 다시 추가해야 함을주의해야한다.

레이더로 제출 : 12931434. 업데이트 : DUP는 13060693입니다.

관련 문제