iOS-iOSのWindowコントロール(表示/非表示)

2582 ワード

多くの場合、私たちは他のコントロールで発生したwindowを隠す必要があります.ここ数日プロジェクトをしていたとき、自分がwindow付きのコントロールを開いて、フラッシュメッセージを受け取って、自分のappはトップページに戻りましたが、このwindowはまだあるので、隠す必要があります.

注意点

  • UIAlertViewとUIActionSheetはUIApplicationから利用できない.sharedApplication.Windows取得.
  • windowレベルがNormalである以上隠すことはできません.

  • イニシアチブ

  • UIAlertViewおよびUIActionSheet Hookのshowメソッドをグローバルに取得する.あるいは直接メソッドで置き換える方式で、カスタムメソッドとshowメソッドを置き換えることで、格納の役割を果たします.
  • 判断すればいいです.

  • インプリメンテーション


    ここではプロジェクトにAspectsが統合されているのでhook方式で
    UIActionSheet
    + (void)load
    {
        id sheetShowInViewHook = ^(id aspectInfo) {
            if ([aspectInfo.instance isKindOfClass:[UIActionSheet class]]){
                UIActionSheet *sheet = aspectInfo.instance;
                [UIWindow saveAlertOrSheetView:sheet];
            }
        };
        
        [self aspect_hookSelector:@selector(showInView:)
                      withOptions:AspectPositionAfter
                       usingBlock:sheetShowInViewHook
                            error:nil];
    }
    
    

    UIAlertView
    + (void)load
    {
        id alertShowHook = ^(id aspectInfo) {
            if ([aspectInfo.instance isKindOfClass:[UIAlertView class]]){
                UIAlertView *alertView = aspectInfo.instance;
                [UIWindow saveAlertOrSheetView:alertView];
            }
        };
        
        [self aspect_hookSelector:@selector(show)
                      withOptions:AspectPositionAfter
                       usingBlock:alertShowHook
                            error:nil];
    }
    

    使いやすいように、windowに直接分類します.
    ==ここでNSHashTableで重複保存を防止する==
    static NSHashTable *viewTable;
    
    + (void)load
    {
        viewTable = [NSHashTable weakObjectsHashTable];
    }
    
    + (void)saveAlertOrSheetView:(UIView *)view
    {
        [viewTable addObject:view];
    }
    
    + (void)hideAllWindowsExceptNormal
    {
        for (UIWindow *window in UIApplication.sharedApplication.windows) {
            BOOL windowLevelNormal = (window.windowLevel != UIWindowLevelNormal);
            if(windowLevelNormal) {
                [window setHidden:YES];
            }
        }
        
        for (UIView *view in viewTable) {
            if ([view isKindOfClass:[UIAlertView class]]) {
                UIAlertView *alertView = view;
                [alertView dismissWithClickedButtonIndex:alertView.cancelButtonIndex animated:NO];
            }
            
            if ([view isKindOfClass:[UIActionSheet class]]) {
                UIActionSheet *acitonSheet = view;
                [acitonSheet dismissWithClickedButtonIndex:acitonSheet.cancelButtonIndex animated:NO];
            }
        }
    }