iPhone - 将键盘从右侧滑入视图,就像在"通讯录"中编辑音符一样

T .*_*T . 19 iphone keyboard animation animated

我正在寻找一种方法将键盘从右侧滑入视图,就像编辑音符时在"联系人"应用程序中发生的情况一样.

我的问题是,当我在viewWillAppear中调用[someTextView becomeFirstResponder]时,键盘立即弹出,没有动画.当我在viewDidAppear中调用它时,视图首先从右侧滑入(UINavigationController进行滑动),然后键盘从底部滑入.

是否可以将键盘从右侧与视图一起滑入?

ma1*_*w28 17

在iOS系统7,要求becomeFirstResponder_textViewviewDidLayoutSubviews工作.

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [_textView becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

注意:执行此操作viewWillLayoutSubviews也有效.

说明

阅读文档中关于becomeFirstResponder的讨论.

您可以调用此方法来创建响应者对象,例如查看第一响应者.但是,如果它是视图层次结构的一部分,则只应在该视图上调用它.如果视图的window属性包含UIWindow对象,则它已安装在视图层次结构中; 如果返回nil,则视图将从任何层次结构中分离.

使用导航控制器在屏幕上推送自定义视图控制器时,self.view.windownil处于调用状态viewDidLoad或被viewWillAppear:调用时.所以,_textView.window也是nil在相同的方法中,因为_textView是子视图self.view,即它们都在同一个窗口中.不管你如何展示你的自定义视图控制器self.view.window(因此_textView.window)也是nilinitWithNibName:bundle:.self.view.windowviewDidAppear:被调用的时间设置,但是为时已晚,因为到那时,导航控制器已经完成了在屏幕上推动视图的动画.

self.view.window也可以通过时间viewWillLayoutSubviews或被viewDidLayoutSubviews调用来设置,并且在导航控制器的推动动画开始之前调用这些方法.所以,这就是为什么当你用这两种方法中的任何一种方法时它都可以工作.

不幸的是,viewWillLayoutSubviews并且viewDidLayoutSubviews不仅仅是在初始导航控制器推送上调用了更多.但是,navigationController:willShowViewController:willMoveToParentViewController:太立即调用(之后viewDidLoad,但之前self.view.window设置),并navigationController:didShowViewController:didMoveToParentViewController:被调用为时已晚(推动画完成后).

我能想到的唯一另一种方法是以某种方式观察window属性,_textView以便在它发生变化时得到通知,但我不知道如何做到这window一点readonly.

  • 我注意到在使用此方法时第一次加载视图时会出现明显的延迟.关于如何解决这个问题的任何想法? (2认同)

tit*_*coy 11

您需要做的就是告诉有问题的文本视图成为viewDidLoad您正在推送到导航堆栈的视图控制器方法中的第一个响应者:

override func viewDidLoad() {
    super.viewDidLoad()
    someTextView.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)

这适用于iOS 8.键盘从右侧滑入视图.

  • 在iOS 7中,此解决方案对我不起作用.有没有人找到适用于iOS 7的解决方案? (5认同)
  • @AlexPretzlav我找到了[适用于iOS 7的解决方案](http://stackoverflow.com/a/19580888/242933). (2认同)