2012-10-22 7 views
2

응용 프로그램의 표시되고 숨겨진 창의 뷰 계층 구조를 인쇄하려고합니다. 여기 MFMessageComposeViewController의 하위 내부 내 코드의 일부이다 :UIButton은 iOS 6.0의 MFMessageComposeController에서 nil입니다.

NSArray *windows = [[UIApplication sharedApplication] windows]; 

for(UIWindow *aWindow in windows) { 
    if([aWindow isMemberOfClass:NSClassFromString(@"UITextEffectsWindow")]) { 
     sendButton = [self findButtonInView:aWindow]; 
      break; 
    } 
} 

findButtonInView : 방법은 현재 UIWindow에서 재귀있는 UIButton 찾고있다.

iOS4.3 및 iOS 5.1 (예상되는 UIButton이 성공적으로 발견됨)로 테스트 할 때 예상대로 작동하지만 iOS6에서는 작동하지 않습니다.

아이폰 OS 4.3 :

<UITextEffectsWindow: 0x1e32a0; frame = (0 0; 320 480); opaque = NO; layer = <CALayer: 0x1e33d0>> 
    | <UIPeripheralHostView: 0x1e4a80; frame = (0 224; 320 256); autoresizesSubviews = NO; layer = <UIPeripheralHostLayer: 0x1e4e60>> 
    | | <UIKeyboardAutomatic: 0x1ad300; frame = (0 40; 320 216); opaque = NO; layer = <CALayer: 0x1ad3b0>> 
    | | | <UIKeyboardImpl: 0x1ad520; frame = (0 0; 320 216); opaque = NO; layer = <CALayer: 0x1ad6c0>> 
    | | | | <UIKeyboardLayoutStar: 0x1d47c0; frame = (0 0; 320 216); layer = <CALayer: 0x19ca40>> 
    | | | | | <UIKBKeyplaneView: 0x1df880; frame = (0 0; 320 216); layer = <CALayer: 0x1df900>> 
    | | | | | | <UIKBKeyView: 0x1dfe00; frame = (1 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1dffd0>> 
    | | | | | | <UIKBKeyView: 0x1e0090; frame = (279 119; 40 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e00e0>> 
    | | | | | | <UIKBKeyView: 0x1e01e0; frame = (1 173; 38 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e0230>> 
    | | | | | | <UIKBKeyView: 0x1dbfb0; frame = (41 173; 38 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1dc050>> 
    | | | | | | <UIKBKeyView: 0x1e0330; frame = (81 173; 158 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e0380>> 
    | | | | | | <UIKBKeyView: 0x1e0440; frame = (241 173; 78 42); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e0490>> 
    | | <CKMessageEntryView: 0x182500; baseClass = UIImageView; frame = (0 0; 320 40); opaque = NO; autoresize = W+TM; layer = <CALayer: 0x1837c0>> 
    | | | <UIButton: 0x1878c0; frame = (6 8; 26 27); hidden = YES; opaque = NO; autoresize = RM+TM; layer = <CALayer: 0x182e60>> 
    | | | | <UIImageView: 0x1e56f0; frame = (0 0; 26 27); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1e5720>> 
    | | | <UIView: 0x184dd0; frame = (7 0; 245 40); autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x185130>> 
    | | | <CKContentEntryView: 0x188a50; baseClass = UIScrollView; frame = (6 0; 249 40); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x187230>; contentOffset: {-0, -10}> 
    | | | | <CKRichContentView: 0x193790; baseClass = UITextContentView; frame = (0 0; 249 20); text = ''; autoresize = W; layer = <CALayer: 0x1938a0>> 
    | | | | | <UIWebDocumentView: 0xaef200; frame = (0 0; 249 20); text = ' 
'; opaque = NO; userInteractionEnabled = NO; layer = <UIWebLayer: 0x196c20>> 
    | | | | | <UITextSelectionView: 0x1a5b60; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x1a5c00>> 
    | | | | <UIImageView: 0x189fa0; frame = (242 10; 7 20); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x189ff0>> 
    | | | | <UIImageView: 0x189eb0; frame = (242 23; 7 7); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x189f00>> 
    | | | <UIImageView: 0x18a190; frame = (7 0; 245 40); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x18a510>> 
    | | | <UILabel: 0x18a6b0; frame = (245 13; 73 15); text = 'TEST'; clipsToBounds = YES; hidden = YES; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x18a720>> 
    | | | <UIButton: 0x180d00; frame = (252 8; 61 27); opaque = NO; autoresize = LM+TM; layer = <CALayer: 0x184e00>> 
    | | | | <UIImageView: 0x1ad460; frame = (0 0; 61 27); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1ad490>> 
    | | | | <UIButtonLabel: 0x1871c0; frame = (11 3; 39 20); text = 'Send'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x187280>> 

아이폰 OS 6.0 :

<UIWindow: 0x1fd81f80; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x1fd82080>> 
    | <UILayoutContainerView: 0x1fd94d50; frame = (0 0; 320 480); autoresize = W+H; layer = <CALayer: 0x1fd94df0>> 
    | | <UINavigationTransitionView: 0x1fd9a450; frame = (0 0; 320 480); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1fd9a520>> 
    | | | <UIViewControllerWrapperView: 0x1fdac9a0; frame = (0 20; 320 460); autoresize = W+H; layer = <CALayer: 0x1fdaca30>> 
    | | | | <UIView: 0x1fda8cb0; frame = (0 0; 320 460); autoresize = W+H; layer = <CALayer: 0x1fda8c70>> 
    | | | | | <_UISizeTrackingView: 0x1fda6430; frame = (0 0; 320 460); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0x1fda6510>> 
    | | | | | | <_UIRemoteView: 0x1fda6700; frame = (0 0; 320 480); transform = [0.5, -0, 0, 0.5, -0, 0]; userInteractionEnabled = NO; layer = <CALayerHost: 0x1fda6850>> 

내 질문이 얼마나 필요한있는 UIButton 수있다 다음은 두 테스트에서 뷰 계층 인쇄의 결과입니다 UITextEffectsWindow에서 찾을 수 있습니까?

iOS6의의 뷰 계층 구조가 어떻게 든 변경 것 같다 ...

난 어떤 도움을 주셔서 감사합니다. 감사!

답변

1

변경되었을 수 있습니다. UI에 표시되는 문서화되지 않은 요소에 액세스하고 있으며 시스템 업데이트를 통해 일관성을 유지할 수는 없습니다. MFMailComposeViewController 클래스에 표시된 UI 요소의 모양을 변경하려면 IUAppearance API를 사용하십시오. 메일 컨트롤러 클래스의 많은 부분에 액세스하지 않아도됩니다.

중요 메일 작성 인터페이스 자체는 사용자 지정할 수 없으며 응용 프로그램에서 수정하면 안됩니다. 또한 인터페이스를 제공 한 후에는 애플리케이션에서 이메일 내용을 더 이상 변경할 수 없습니다. 사용자는 여전히 인터페이스를 사용하여 콘텐츠를 편집 할 수 있지만 프로그래밍 방식의 변경은 무시됩니다. 따라서 인터페이스를 표시하기 전에 내용 필드의 값을 설정해야합니다.

+0

답변이 너무 많아서 App Store에 있고 사용자에게 속한 iPad/iPhone에서 실행되는 App에 글을 쓰고 있다고 가정합니다. 우리 중 일부는 인터페이스의 일부 (예 :받는 사람 : reciepents)에 대한 액세스가 실제로 일부 국가 (예 : 프랑스)의 개인 정보 문제인 내부 애플리케이션 또는 키오스크에서도 작업합니다. 그래서, 우리는 무엇을합니까? 우리는 Mail Composer를 해킹합니다 ... 아니면 최소한 우리는했습니다. 이제 iOS6에서는 매우 불투명합니다. 이것에 대한 주제를 만들 겠지만, 나는 10k의 엄지 손가락을 얻을 것이라고 확신한다. -e – eric

+0

어쩌면 더 엄지 손가락을 내릴 수 있습니다. 그 이유는 사용자의 동의없이 "해킹"이 무언가를하고 있기 때문입니다. 정말로 사용자의 이메일 계정으로 이메일을 보내시겠습니까? 자신의 메일 클라이언트를 구현하고, 사용자에게 자격 증명을 요청하고, 보내려는 모든 이메일을 보냅니다. – J2theC

+0

아, 클라이언트 만 그렇게한다면. 그것은 처음이자 가장 강력한 선택이었습니다. 원래 2 개 OS 업그레이드를 통해 해킹을 다시 시도했습니다 ... 그러나 결국 클라이언트는 "항상 옳습니다". 우리는 이것이 iOS6의 옵션이 아니므로, REST 호출을 통해 키오스크에서 보내려는 이메일을 전달할 것입니다. 단지 지적하고 싶습니다. 많은 대답은 아마 가정을합니다. 만들 수 없습니다. :-) – eric

관련 문제