【问题标题】:keyboard size given by NSNotificationCenterNSNotificationCenter 给出的键盘尺寸
【发布时间】:2012-07-02 17:54:55
【问题描述】:

我想在从 UISearchBar 调用的键盘上添加一个附件视图。由于 UISearchBar 没有实现这个属性,我刚刚创建了一个工具栏。继Apple's documentation 之后,我决定使用通知中心不仅可以知道何时调用键盘,还可以知道键盘的大小,这取决于方向。

我已经按照文档中的示例进行操作,并且在 keyboardWasShown 方法中,我调用了一个动画,它将在键盘顶部显示工具栏。像这样的:

-(void)keyboardWasShown:(NSNotification*)aNotification {

    NSDictionary *info=[aNotification userInfo];
    CGSize keyboardSize=[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

     NSLog(@"width: %.1f; height: %.1f", keyboardSize.width, keyboardSize.height );

    [self showAccessoryView:keyboardSize.height];
}

并且,在动画中,我将工具栏的框架设置为:

 self.auxiliaryKeyboardBar.frame=CGRectMake(0, self.view.frame.size.height-(44+kbh), self.view.frame.size.width, 44);

其中 44 是工具栏的静态高度,kbh 是从上述方法传递的keyboard.size.heigth。

我观察到的问题是userInfo Dictionary 给出的键盘大小总是指纵向。所以,纵向的 NSLog 是:

width: 320.0; heigth: 216.0,没关系

但是当我将方向更改为横向并调用键盘时,NSLog 如下:

width: 162.0; heigth: 480.0,使工具栏超出范围。

所以,我最终在调用动画之前添加了一个条件,例如:

if ([self deviceIsPortrait]==YES) {
        [self showAccessoryView:keyboardSize.height];
    }else if ([self deviceIsPortrait]==NO) {
        [self showAccessoryView:keyboardSize.width];
    }

我现在想知道我是否做错了什么,因为我严格按照 Apple 的示例来避免依赖键盘高度(作为浮点数),最终我不得不添加一个方向条件。

这是怎么回事?

【问题讨论】:

    标签: ios nsnotificationcenter uikeyboard device-orientation


    【解决方案1】:

    我认为你缺少的是:

    CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window];
    

    这有点脱离上下文,所以这里是完整的实现:

    - (void) keyboardDidShow:(NSNotification*)notification {
        CGRect keyboardFrame = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
        NSLog(@"keyboard frame raw %@", NSStringFromCGRect(keyboardFrame));
    
        UIWindow *window = [[[UIApplication sharedApplication] windows]objectAtIndex:0];
        UIView *mainSubviewOfWindow = window.rootViewController.view;
        CGRect keyboardFrameConverted = [mainSubviewOfWindow convertRect:keyboardFrame fromView:window];
        NSLog(@"keyboard frame converted %@", NSStringFromCGRect(keyboardFrameConverted));
    }
    

    【讨论】:

    • UIKeyboardFrameBeginUserInfoKey 键下存储的 CGRect 在窗口的坐标系中(始终处于非旋转方向)
    • 感谢您的回答和澄清。总之,脖子有点疼。
    • 这似乎不适用于 64 位设备。
    猜你喜欢
    • 2011-02-14
    • 2019-06-06
    • 2015-08-30
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多