我正在寻找一种方法将键盘从右侧滑入视图,就像编辑音符时在“联系人”应用程序中所发生的那样。
我的问题是,当我在viewWillAppear中调用[someTextView becomeFirstResponder]时,键盘立即弹出,没有动画。当我在viewDidAppear中调用它时,视图首先从右侧滑入(UINavigationController执行滑动),然后键盘从底部滑入。
是否可以让键盘从右侧与视图一起滑入?
答案 0 :(得分:17)
在iOS 7中,在becomeFirstResponder
的{{1}}上拨打_textView
即可。
viewDidLayoutSubviews
注意:在- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[_textView becomeFirstResponder];
}
中执行此操作也可以。
阅读becomeFirstResponder文档中的讨论。
您可以调用此方法来创建响应者对象,例如查看第一响应者。但是,如果它是视图层次结构的一部分,则只应在该视图上调用它。如果视图的
viewWillLayoutSubviews
属性包含window
对象,则它已安装在视图层次结构中;如果它返回UIWindow
,则视图将从任何层次结构中分离。
使用导航控制器在屏幕上推送自定义视图控制器时,nil
在self.view.window
或nil
被调用时仍为viewDidLoad
。因此,viewWillAppear:
在同一方法中也是_textView.window
,因为nil
是_textView
的子视图,即它们都在同一窗口中。无论您如何展示自定义视图控制器,self.view
(以及self.view.window
)在_textView.window
中也是nil
。 initWithNibName:bundle:
是在调用时间self.view.window
时设置的,但为时已晚,因为到那时,导航控制器已经完成了在屏幕上推送视图的动画。
viewDidAppear:
也是在调用self.view.window
或viewWillLayoutSubviews
时设置的,并且在导航控制器的推送动画开始之前调用这些方法。所以,这就是为什么当你在其中任何一种方法中都这样做时。
不幸的是,viewDidLayoutSubviews
和viewWillLayoutSubviews
被调用的次数远远超过初始导航控制器推送。但是,viewDidLayoutSubviews
和navigationController:willShowViewController:
过早被调用(在willMoveToParentViewController:
之后但在设置viewDidLoad
之前)并且self.view.window
和navigationController:didShowViewController:
被调用得太晚了(推动画后)。
我能想到的另一种方法是以某种方式观察didMoveToParentViewController:
的{{1}}属性,以便在它发生变化时得到通知,但我不知道如何做到这一点window
为_textView
。
答案 1 :(得分:11)
您需要做的就是告诉有问题的文本视图成为您推送到导航堆栈的视图控制器的viewDidLoad
方法中的第一个响应者:
override func viewDidLoad() {
super.viewDidLoad()
someTextView.becomeFirstResponder()
}
这适用于iOS 8.键盘从右侧滑入视图。
答案 2 :(得分:3)
在iOS 7(或之前的任何版本)中,您可以在 loadView , viewDidLoad 或 viewWillAppear
中做一件简单的事情[yourTextView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];
在这种情况下,您将获得与推动视图控制器的动作对齐的键盘从左到右的外观。
答案 3 :(得分:3)
对于iOS 7,我发现以下解决方案最适合我:
- 导入UIResponder-KeyboardCache
到您的项目。
- 在键盘视图之前将[UIResponder cacheKeyboard:YES];
添加到视图的viewDidLoad
。最好在应用程序加载时立即执行此操作,或者在您负担得起的时候(例如在HTTP请求期间)执行此操作。在大多数情况下,只需在视图中就足够了。
- 将以下内容添加到键盘视图的viewDidLoad
。
dispatch_async(dispatch_get_main_queue(), ^{
[_textField becomeFirstResponder];
});
为了解释,这将预加载键盘视图,这将消除第一次调用键盘视图时的延迟。在主队列中的文本字段上调用becomeFirstResponder
会导致它与视图一起滑入,而不是在视图滑入之前向上动画。
答案 4 :(得分:0)
在将其推入堆栈之前,您可以尝试将becomeFirstResponder消息发送到新的视图控制器。例如:
-(void)functionWhereYouPushTheNewViewController {
yourNewViewController *newVC = [[yourNewViewController alloc] init];
[newVC.yourTextView becomeFirstResponder];
[self.navigationController pushViewController:newVC animated:YES];
}
我发现,改变动画类似键盘上的动画非常困难,如果你阅读了人机界面指南,Apple很清楚他们希望某些事情能够以某种方式一直行动起来。有一些方法可以改变某些动画的行为,但它们通常涉及未记录的API调用,并且是从应用商店拒绝的理由。例如,推动视图从底部向上滑动将违反HIG。
希望这有帮助。