好的,我知道我可以使用通知 UIKeyboardWillShowNotification 来读取键盘尺寸,这个
keybSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
但只有在键盘显示时才会显示。
但问题是:我有一个窗口,当键盘可见和iPhone旋转时,必须将自己调整到一个新位置。当我旋转iPhone时,两个代理方法 willRotateToInterfaceOrientation 和 didRotateFromInterfaceOrientation 运行并处理旋转。在这些方法中我需要知道当前的键盘高度,所以我可以正确定位视图。问题是UIKeyboardWillShowNotification通知触发的方法在委托方法处理轮换之后运行。
方法运行的顺序是:
换句话说,键盘高度只是在最后读取,这意味着方法1和2都将使用旧的键盘高度。
我的问题是:有没有办法直接读取可见键盘的键盘高度,而不是依赖于通知触发的方法?
感谢
答案 0 :(得分:4)
您可以使用此代码段来浏览视图层次结构:
- (void)printSubviews:(UIView *)aView {
NSLog(@"%@ - %@", [aView class], NSStringFromCGRect([aView frame]));
for (UIView *view in [aView subviews]) {
[self printSubviews:view];
}
}
- (void)printAllViews {
for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
[self printSubviews:window];
}
}
你会发现从你得到的值中找出键盘大小非常容易。
或者,您可以导入UIKeyboard.h
(您可以在互联网上找到它)。它包括一种获取各种界面方向的默认键盘大小的方法。但是,这将使用私有API,因此您可能需要小心它。
答案 1 :(得分:-1)
当键盘已经可见时,我在旋转时设置UIScrollView
的内容插入时出现问题。这就是我的成果(并且它不涉及任何过于苛刻的解决方案)。
您的视图控制器订阅UIKeyboardWillShowNotification
的想法是正确的,是最好的方法 - 不要尝试以任何其他方式计算键盘大小,因为a)键盘大小可能无法预测,并且b)您不希望冒使用私有API的风险。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
}
这就是keyboardWillShow
方法。如果你正在使用UIKeyboardWillShowNotification
- 就像我一样 - 你会想要从UIKeyboardFrameEndUserInfoKey
键中获得最终的键盘大小。
- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *info = [notification userInfo];
NSTimeInterval duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey]
doubleValue];
CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey]
CGRectValue].size;
UIInterfaceOrientation orientation = [[UIApplication sharedApplication]
statusBarOrientation];
UIEdgeInsets insets = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0);
// The gotcha is that the keyboard size as reported by
// UIKeyboardFrameEndUserInfoKey is always reported as if the device was in
// portrait mode. I've had to work around that a little by setting the
// bottom edge to the keyboard's width.
if (UIInterfaceOrientationIsLandscape(orientation)) {
insets = UIEdgeInsetsMake(0, 0, keyboardSize.width, 0);
}
[UIView animateWithDuration:duration
delay:0
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
self.gridScrollView.contentInset = insets;
self.gridScrollView.scrollIndicatorInsets = insets;
} completion:nil];
}
希望这对您有所帮助 - 再次,使用通知来实现您想要的完全可能和安全。