ios11在鍵盤彈起和UIAlertController出現(xiàn)之后會出現(xiàn)一個UITextEffectsWindow且不消失了内狗,內(nèi)部包含UIInputSetContainerView->UIInputSetHostView(高度:258),SVProgressHuB為了適配鍵盤彈起,會遍歷window獲取這個window及其中UIInputSetHostView的高度以調(diào)整hudView的center,這樣就會造成huvView之后一直不居中。
那么我們應(yīng)該怎么解決呢范嘱?我是用的辦法是:判斷UIInputSetHostView是否在window中违诗,如果在則在調(diào)起SVProgressHUD提示框時,設(shè)置一下其相對于中心點的偏移量:
#define SHOWSUCCESS_SVP_STRING(str) dispatch_async(dispatch_get_main_queue(),^{\
[SVProgressHUD setDefaultStyle:SVProgressHUDStyleDark];\
[SVProgressHUD setSuccessImage:nil];\
[SVProgressHUD showSuccessWithStatus:str];\
[SVProgressHUD dismissWithDelay:1.5f];\
if ([CommonTools adjustSVProgressHuDHudViewCenter] > 0){\
[SVProgressHUD setOffsetFromCenter:UIOffsetMake(0, (-CGRectGetHeight(UIApplication.sharedApplication.statusBarFrame) + [CommonTools adjustSVProgressHuDHudViewCenter]) * 0.45)];\
}\
});
判斷及獲取UIInputSetHostView高度的代碼<同SVProgressHUD內(nèi)部的代碼看锉,SVProgressHUD.m文件 1328行>:
+(CGFloat)adjustSVProgressHuDHudViewCenter{
UIWindow *keyboardWindow = nil;
for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) {
if(![[testWindow class] isEqual:[UIWindow class]]) {
keyboardWindow = testWindow;
break;
}
}
for (__strong UIView *possibleKeyboard in [keyboardWindow subviews]) {
if([possibleKeyboard isKindOfClass:NSClassFromString(@"UIPeripheralHostView")] || [possibleKeyboard isKindOfClass:NSClassFromString(@"UIKeyboard")]) {
return CGRectGetHeight(possibleKeyboard.bounds);
} else if([possibleKeyboard isKindOfClass:NSClassFromString(@"UIInputSetContainerView")]) {
for (__strong UIView *possibleKeyboardSubview in [possibleKeyboard subviews]) {
if([possibleKeyboardSubview isKindOfClass:NSClassFromString(@"UIInputSetHostView")]) {
return CGRectGetHeight(possibleKeyboardSubview.bounds);
}
}
}
}
return 0;
}