iOSマルチウィンドウ開発

1665 ワード

ええ、学習の過程を記録して、以前記録しないで、多くの解決した問題がまた私に迷惑をかけて、よくありません
プロジェクト開発には複数のテスト環境があり、常に異なる環境調整コードを切り替えるため、テストは常に再パッケージされるため、githubで懸濁窓テストを探して自分で環境を切り替えることができます.
すると、問題のキーボードとカスタムフレームが弾けないことがあります.

UIAlertViewとUIActionSheetがshow中にシステムにwindowを追加したことが判明しました(_Ui a i a l e t C o n t o r l l erShimPresenterWindow)、windowLevelはUIWindowLevelAlert(2000)


フレームが消えると自動的にkeywindowをwindowLevel値が最も高いwindowに割り当てます


UIalertControllerはwindowを新規作成しません


私のカスタムフレームはすべてaddがwindowの上でのですべて懸濁窓の上で重い影の現象をもたらしました


解決策


KVOでkeywindowの値変化を傍受しようとしたが、何keywindowにはsetterメソッドがなく、システムの属性がない場合があり、setterメソッドを書き換える傍受ができない場合は非システムの属性しか適用されないので、放棄する
幸いなことに、システムはUID i n d w D i d P o m e VisibleNotificationとUID i n d w D i d P o m e HiddenNotification通知を定義しています.この2つの通知をリスニングしてkeywindowを動的に変更すればいいです.
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeKeyWindow:) name:UIWindowDidBecomeKeyNotification object:nil];


-(void)changeKeyWindow:(NSNotification *)notifcation{
NSLog(@"%@--%@",[UIApplication sharedApplication].keyWindow,[self class]);
if ([[UIApplication sharedApplication].keyWindow isMemberOfClass:[self class]]) {
    
    for (UIWindow * window in [UIApplication sharedApplication].windows) {
        if (UIWindowLevelNormal == window.windowLevel){
            NSLog(@"%f--%f",UIWindowLevelNormal,window.windowLevel);
            
            
        }
        if([window isMemberOfClass:[UIWindow class]]){
            [window makeKeyAndVisible];
            //            [window addSubview:self];
        }
        
    }
    
}

}