UIKeyboard 是私有類,無法直接 #import 頭文件,[view isKindOfClass:[UIKeyboard class]] 編譯失敗。
// Swift
if view.isKind(of: NSClassFromString("UIKeyboard")!) {
print("這是鍵盤視圖")
}
// Objective-C
if ([view isKindOfClass:NSClassFromString(@"UIKeyboard")]) {
NSLog(@"這是鍵盤視圖");
}
NSClassFromString 通過字串名稱在 Runtime 中查找類對象Class 類型,可用於 isKindOfClass: / isMemberOfClass:
- (void)keyboardWillShow:(NSNotification *)notification {
CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
// 遍歷窗口子視圖尋找鍵盤
for (UIView *view in [[UIApplication sharedApplication].windows lastObject].subviews) {
if ([view isKindOfClass:NSClassFromString(@"UIKeyboard")]) {
// 找到鍵盤視圖,可獲取其 frame、動畫曲線等
// 注意:iOS 版本不同,鍵盤視圖層級結構可能變化
}
}
}
// 獲取鍵盤框架 (推薦)
CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
// 轉換到當前視圖座標系
keyboardFrame = [self.view convertRect:keyboardFrame fromView:nil];
// 獲取動畫時長和曲線
NSTimeInterval duration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] intValue];
// 響應式調整佈局
[UIView animateWithDuration:duration
delay:0
options:curve << 16
animations:^{
// 更新約束/frame
} completion:nil];
| 風險 | 說明 |
|---|---|
| App Store 審核可能拒絕 (雖單純檢測類名通常通過,但不保證) | |
| iOS 版本升級可能改變類名/結構 (如 iOS 16+ 鍵盤架構大變) | |
| 第三方鍵盤、Safari 鍵盤類名可能不同 |
UIKeyboardFrameEndUserInfoKey 等,無需識別私有視圖NSClassFromString 返回 AnyClass? 需解包