iPhone - 知道键盘尺寸已经显示

时间:2011-03-28 18:37:22

标签: iphone

好的,我知道我可以使用通知 UIKeyboardWillShowNotification 来读取键盘尺寸,这个

keybSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

但只有在键盘显示时才会显示。

但问题是:我有一个窗口,当键盘可见和iPhone旋转时,必须将自己调整到一个新位置。当我旋转iPhone时,两个代理方法 willRotateToInterfaceOrientation didRotateFromInterfaceOrientation 运行并处理旋转。在这些方法中我需要知道当前的键盘高度,所以我可以正确定位视图。问题是UIKeyboardWillShowNotification通知触发的方法在委托方法处理轮换之后运行。

方法运行的顺序是:

  1. willRotateToInterfaceOrientation
  2. didRotateFromInterfaceOrientation
  3. UIKeyboardWillShowNotification方法
  4. 换句话说,键盘高度只是在最后读取,这意味着方法1和2都将使用旧的键盘高度。

    我的问题是:有没有办法直接读取可见键盘的键盘高度,而不是依赖于通知触发的方法?

    感谢

2 个答案:

答案 0 :(得分:4)

变式1

您可以使用此代码段来浏览视图层次结构:

- (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];
    }
}

你会发现从你得到的值中找出键盘大小非常容易。

变式2

或者,您可以导入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];
}

希望这对您有所帮助 - 再次,使用通知来实现您想要的完全可能和安全。