使UITextView父级成为自己的inputAccessoryView

时间:2013-11-20 22:14:01

标签: ios objective-c uikeyboard

我正在尝试实现与iOS 7中的消息类似的键盘交互。我有一个UIView,其中包含UITextView,当用户选择它开始输入时,我想要将此UIView设为inputAccessoryView。这将照顾我的动画,以及iOS 7中新的UIScrollView键盘关闭交互。

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

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

有什么建议吗?

3 个答案:

答案 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.