旋转设备时使自定义视图粘在键盘顶部

make custom view stick to top of the keyboard while rotating device

我的应用只有 iPad,根视图嵌入在具有两个子视图的导航控制器中:

1) 一个 UITextView(不是 UITextField),覆盖除了导航栏之外的整个区域。

2) 另一个 UIView 作为工具栏。它覆盖了 UITextView 并且最初停留在根视图的底部。

现在我可以使 "tool bar" 与虚拟键盘同步上下移动。

但是有一个问题:如果我在键盘显示时旋转设备,"tool bar"不再粘在虚拟键盘的顶部,而是它旋转时停留在屏幕中间旋转后掉下来碰到键盘,非常难看

目前我通过动态添加和删除约束使 工具栏 视图上下移动,我不确定这是否是一个问题,因为我只是在测试它使用模拟器。

有人可以给我一些建议吗?

此类 底部带有工具栏的 UITextView 应用程序的示例可能是 Document Pro or Pages.

作为替代方案,您可以在不应用约束的情况下手动布置工具栏。为此,您可以:

添加处理键盘出现的方法。

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:)                                               name:UIKeyboardDidShowNotification object:nil];

此方法需要计算当前键盘高度。

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    self.keyboardHeight = MIN(kbSize.height, kbSize.width);
    [self layoutElements];
}

旋转设备时也会调用此方法。

然后在您的自定义 layoutElements 方法中使用预先计算的键盘高度来定位您的工具栏。

您可以使用根视图的大小或屏幕大小 ([[UIScreen mainScreen] bounds].size),但请注意 iOS7 和 iOS8+ [=15] 的值不同=] 和 height 取决于方向。

为确保您的自定义布局方法 (layoutElements) 被调用,您也可以将其放在 viewWillLayoutSubviews 方法中。

- (void) viewWillLayoutSubviews {
    [super viewWillLayoutSubviews];
    [self layoutElements];
}

我会推荐使用inputAccessoryView属性的UITextView

UIToolbar* toolbar = [[UIToolbar alloc] init];
toolbar.barStyle = UIBarStyleDefault;
toolbar.items = [NSArray arrayWithObjects:
                       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCompose target:nil action:nil],
                       [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:nil action:nil],
                       [[UIBarButtonItem alloc]initWithTitle:@"Cancel" style:UIBarButtonItemStylePlain target:self action:nil],
                       [[UIBarButtonItem alloc]initWithTitle:@"Done" style:UIBarButtonItemStyleDone target:self action:nil],
                       nil];
[toolbar sizeToFit];
self.textfiled.inputAccessoryView = toolbar;

简单地使用上面的方法,您将在键盘顶部粘贴一个工具栏,并且在旋转过程中它会有一个漂亮而流畅的动画。我没有看过您引用的其他应用程序,但我相信这就是他们在 Pages 中使用的应用程序。