iOS-iOSのWindowコントロール(表示/非表示)
2582 ワード
多くの場合、私たちは他のコントロールで発生したwindowを隠す必要があります.ここ数日プロジェクトをしていたとき、自分がwindow付きのコントロールを開いて、フラッシュメッセージを受け取って、自分のappはトップページに戻りましたが、このwindowはまだあるので、隠す必要があります.
UIAlertViewとUIActionSheetはUIApplicationから利用できない.sharedApplication.Windows取得. windowレベルがNormalである以上隠すことはできません.
UIAlertViewおよびUIActionSheet Hookのshowメソッドをグローバルに取得する.あるいは直接メソッドで置き換える方式で、カスタムメソッドとshowメソッドを置き換えることで、格納の役割を果たします. 判断すればいいです.
ここではプロジェクトにAspectsが統合されているのでhook方式で
UIActionSheet
UIAlertView
使いやすいように、windowに直接分類します.
==ここでNSHashTableで重複保存を防止する==
注意点
イニシアチブ
インプリメンテーション
ここではプロジェクトに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];
}
}
}