我正在尝试实现与iOS 7中的消息类似的键盘交互。我有一个UIView
,其中包含UITextView
,当用户选择它开始输入时,我想要将此UIView
设为inputAccessoryView
。这将照顾我的动画,以及iOS 7中新的UIScrollView
键盘关闭交互。
当UITextView
开始编辑时,我正在尝试将其inputAccessoryView
设置为其父UIView
(已在视图层次结构中)。键盘出现但没有配件视图。
我读过一些人正在使用UITextField
的二人组来完成这项工作,但这似乎是一种不好的方法。
有什么建议吗?
答案 0 :(得分:9)
更简单的解决方案是使输入字段成为视图控制器的输入附件视图:
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (UIView *)inputAccessoryView
{
return self.yourInputField;
}
视图将显示在屏幕底部的屏幕上,当它成为响应用户点击它的第一响应者时,将显示键盘。视图将被设置为动画,使其保持在键盘的正上方。
答案 1 :(得分:0)
让这个工作的唯一方法是通过第二个文本字段。这个想法是让它成为一个子视图,但不可见(由于疯狂的矩形)。然后,在获取委托方法的同时,在它和真实文本字段之间来回切换firstResponder。我创建了一个viewController测试项目并执行此操作(您可以复制粘贴并验证行为大约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时,用UIImageView替换它。 。现在外观是一样的。为图像添加一个动画,使得注意发生50毫秒,然后alpha变为0.向真实的文本视图添加类似的动画,使其在50毫秒内具有0的alpha,然后它变为1.您可以能够调整这个,所以过渡是好的(但不是很好)。
2)苹果可能这样做的方法是从键盘移动通知中获取动画曲线和时间。在这种情况下,他们会首先添加一个高度为0的附件视图,并为textField设置动画,使其跟踪键盘,但在其上方。两者同时移动相同的距离。在动画结束时,textField被拉出self.view,附件视图的框架被更改为具有textField的高度,textField被放置为附件容器视图的子视图。这应该可以,但是,它有点复杂。如果你想让别人为你编码,你可以获得100点的赏金。当你走到最后移动textField时,你仍然需要虚拟文本字段,因为当你从它的包含视图中取出它时,它将重新签署第一个响应者。所以最后,你将虚拟字段作为第一个响应者,移动文本字段,然后再将真正的文本字段作为第一个响应者。
答案 2 :(得分:0)
如果你根本不使用.inputAccessoryView
,那么这实际上效果最好,而只是在键盘打开和关闭时为父UIView
的位置设置动画。 Here is an answer describing the process step-by-step with all the code.