旋转设备时使自定义视图粘在键盘顶部
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 中使用的应用程序。
我的应用只有 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 中使用的应用程序。