19

我正在寻找一种将键盘从右侧滑入视图的方法,就像编辑笔记时在联系人应用程序中发生的那样。

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

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

4

5 回答 5

17

解决方案

在 iOS 7 中,调用inbecomeFirstResponder工作。_textViewviewDidLayoutSubviews

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [_textView becomeFirstResponder];
}

注意:这样做viewWillLayoutSubviews也可以。

解释

阅读becomeFirstResponder文档中的讨论。

您可以调用此方法以使响应者对象(例如视图)成为第一响应者。但是,如果它是视图层次结构的一部分,您应该只在该视图上调用它。如果视图的window属性包含一个UIWindow对象,则它已安装在视图层次结构中;如果它返回nil,则视图与任何层次结构分离。

当使用导航控制器将您的自定义视图控制器推送到屏幕上时,self.view.window仍然是或者被调用nil的时间。因此,也使用相同的方法,因为是 的子视图,即它们都在同一个窗口中。无论您如何呈现您的自定义视图控制器,(因此)也在. 是在调用的时候设置的,但是为时已晚,因为到那时,导航控制器已经完成了将视图推送到屏幕上的动画。viewDidLoadviewWillAppear:_textView.windownil_textViewself.viewself.view.window_textView.windownilinitWithNibName:bundle:self.view.windowviewDidAppear:

self.view.window也由时间设置viewWillLayoutSubviewsor 或被viewDidLayoutSubviews调用,并且这些方法在导航控制器的推送动画开始之前被调用。所以,这就是为什么当你用这两种方法中的任何一种方法时它都会起作用的原因。

不幸的是,viewWillLayoutSubviews并不viewDidLayoutSubviews仅仅在初始导航控制器推送时被调用。但是,navigationController:willShowViewController:太早willMoveToParentViewController:被调用(在设置之后viewDidLoad但之前self.view.window)并且navigationController:didShowViewController:太晚didMoveToParentViewController:被调用(在推送动画之后)。

我能想到的唯一另一种方法是以某种方式观察 的window属性,_textView以便在它更改时收到通知,但我不知道该怎么做,因为windowis readonly

于 2013-10-25T04:03:08.287 回答
11

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

override func viewDidLoad() {
    super.viewDidLoad()
    someTextView.becomeFirstResponder()
}

这适用于 iOS 8。键盘与视图一起从右侧滑入。

于 2009-07-18T20:43:59.043 回答
3

在 iOS 7(或之前的任何版本)中,您可以在loadViewviewDidLoadviewWillAppear中做一个简单的事情

[yourTextView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0.0];

在这种情况下,您将获得从左到右的键盘外观与推动视图控制器的运动对齐。

于 2013-12-17T16:13:36.387 回答
3

对于 iOS 7,我发现以下解决方案最适合我:

-导入UIResponder-KeyboardCache您的项目。

-添加[UIResponder cacheKeyboard:YES];viewDidLoad键盘视图之前的视图。最好在应用程序加载时立即执行此操作,或者在您负担得起的方便时执行此操作(例如,在 HTTP 请求期间)。在大多数情况下,简单地在视图之前就足够了。

- 将以下内容添加到viewDidLoad键盘视图中。

dispatch_async(dispatch_get_main_queue(), ^{
  [_textField becomeFirstResponder];
});

解释一下,这将预加载键盘视图,这将消除第一次调用键盘视图的延迟。调用becomeFirstResponder主队列中的文本字段会导致它与视图一起滑入,而不是在视图滑入之前向上动画。

于 2014-02-18T23:51:39.350 回答
0

您可以尝试将 becomeFirstResponder 消息发送到新的视图控制器,然后再将其推送到堆栈上。例如:

-(void)functionWhereYouPushTheNewViewController {
  yourNewViewController *newVC = [[yourNewViewController alloc] init];
  [newVC.yourTextView becomeFirstResponder];
  [self.navigationController pushViewController:newVC animated:YES];
}

我发现在键盘之类的东西上更改动画非常困难,如果你阅读人机界面指南,Apple 会很清楚地表明他们希望某些东西始终以某种方式运行。有一些方法可以改变某些动画的行为,但它们通常涉及未记录的 API 调用,并且是应用商店拒绝的理由。例如,将视图从底部向上滑动是违反 HIG 的。

希望这可以帮助。

于 2009-07-15T21:02:46.820 回答