使UITextView父项成为它自己的inputAccessoryView

我想实现类似的消息在iOS 7中的键盘交互。我有一个包含UITextViewUIView ,当用户select它开始input时,我想使这个UIViewinputAccessoryView 。 这将照顾我的animation,以及在iOS 7新的UIScrollView键盘closures交互。

UITextView开始编辑时,我试图将其inputAccessoryView设置为其父级UIView (已经在视图层次结构中)。 键盘出现,但没有附件视图。

我读过一些人正在使用一组UITextField来完成这个工作,但是这似乎是一个不好的方法来实现这个。

有什么build议么?

一个更容易的解决scheme是使您的input字段视图控制器的input附件视图:

 - (BOOL)canBecomeFirstResponder { return YES; } - (UIView *)inputAccessoryView { return self.yourInputField; } 

该视图将显示在屏幕的底部,当它成为响应用户点击它的第一响应者时,键盘将被呈现。 该视图将被设置为animation,使其保持在键盘上方。

让这个工作的唯一方法是通过第二个文本字段。 这个想法是使它成为一个子视图,但不可见(由于疯狂)。 然后,在获取委托方法的同时,将firstResponder在它和真正的文本字段之间来回切换。 我创build了一个viewControllertesting项目,并做了这个(你可以复制粘贴和validation行为约2分钟的时间):

 @implementation ViewController { UITextField *field; UITextField *dummyView; } - (void)viewDidLoad { [super viewDidLoad]; field = [[UITextField alloc] initWithFrame:CGRectMake(0, 460, 320, 20)]; field.borderStyle = UITextBorderStyleRoundedRect; field.delegate = self; //field.inputAccessoryView = field; field.text = @"FOO"; [self.view addSubview:field]; dummyView = [[UITextField alloc] initWithFrame:CGRectMake(0, 40000, 320, 20)]; dummyView.delegate = self; [self.view addSubview:dummyView]; } - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { if(textField == field && textField.superview == self.view) { [field removeFromSuperview]; dummyView.inputAccessoryView = field; [dummyView becomeFirstResponder]; } return YES; } @end 

我应该补充说,自iOS 4以来,我在运输应用程序中使用了这种技术。

编辑:所以有一些其他的想法:

1)为了让键盘开始移动时的毛刺看起来好一点,你可以把你的textView的快照,把它放到一个UIImageView中,当你从主视图中删除textView,用UIImageViewreplace它。 现在外观是一样的。 为图像添加一个animation,以便注意发生了50毫秒,然后阿尔法变为0.添加一个类似的animation到你的真实的文本视图,以便它有一个0为50毫秒的alpha,然后它去1.你可能能够调整这个过渡是好的(但不是很好)。

2)苹果可能这样做的方式是从键盘移动通知中获取animation曲线和时间。 在这种情况下,他们会首先添加0高度的辅助视图,并为textField添加animation,以便追踪键盘,但在其上方。 两者同时移动相同的距离。 在animation的结尾处,textField被拉出self.view,附件视图将其框改变为具有textField的高度,并且textField被放置为附件容器视图的子视图。 这应该工作,但是,它有点复杂。 如果你想让别人给你编码,那么你可以提供100点的奖励。 当你走的时候,你仍然需要伪文本字段,并在最后移动textField,因为当你从它包含的视图中取出它时,它将会退出第一个响应者。 因此,最后,您将虚拟场作为第一响应者,移动文本字段,然后再将真实文本字段作为第一响应者。

如果你完全不使用.inputAccessoryView ,而是在键盘打开和closures的时候只是animation父UIView的位置,这实际上是最好的。 下面是一个用所有代码逐步描述这个过程的答案。