UITextField成为FirstResponder块动画

时间:2014-10-17 17:19:14

标签: uitextfield ios8 uiviewanimation becomefirstresponder

我想显示一个包含UITextField的视图,我会自动显示带有消息becomeFirstResponder的键盘。 使用iOS 7,没有任何问题。 但是从iOS8开始,它不起作用。 我正在配置这样的视图:

- (void)showViewAddScore{
if(!self.viewPopOver){
    //a l'initialisation de la vue, on design le contour
    self.viewPopOver = [self.view viewWithTag:100];
    self.viewPopOver.layer.cornerRadius  = 8;
    self.viewPopOver.layer.masksToBounds = YES;
    self.viewPopOver.layer.borderWidth = 1;
    self.viewPopOver.layer.borderColor = [[UIColor colorWithRed:8.0/255 green:65.0/255 blue:32.0/255 alpha:1] CGColor];
}
//deplacement de la vue
CGPoint point;
point.x = self.viewPopOver.frame.origin.x;
point.y = 300;
[self manageViewPopOver:self.viewPopOver withCGPoint:point];
[self.textfieldAddScore becomeFirstResponder];

}

用动画显示视图的方法:

- (void)manageViewPopOver:(UIView *)view withCGPoint:(CGPoint)point {
[UIView animateWithDuration:0.3
                      delay:0.1
                    options:UIViewAnimationOptionCurveLinear
                 animations:^{
                     CGRect frame = view.frame;
                     frame.origin.y = point.y;
                     frame.origin.x = point.x;
                     view.frame = frame;
                 }
                 completion:nil];

}

问题是: 当我第一次调用方法showViewAddScore时,键盘显示但不显示视图。当我第二次调用该方法时,视图显示。 当我删除行[self.textfieldAddScore becomeFirstResponder];时,视图会在我第一次调用该方法时显示。那么,[self.textfieldAddScore becomeFirstResponder];和动画存在问题。 我已尝试在动画后移动线,但问题仍然存在。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

enter image description here

使用乐器你可以看到,在我的6s +设备上,相当于一段时间~150ms,变成第一响应者劫持是主线程。您可以做的是在您的应用代表中初步加载“假”文本视图:

        // Preloads keyboard so there's no lag on initial keyboard appearance.
        let lagFreeField: UITextField = UITextField()
        self.window?.addSubview(lagFreeField)
        lagFreeField.becomeFirstResponder()
        lagFreeField.resignFirstResponder()
        lagFreeField.removeFromSuperview()

或等到你的UI工作完成后调用becomeFirstResponder,最好是在完成块上。我选择后者是为了不凌乱AppDelegate而且之前是一个“hacky”解决方案。

答案 1 :(得分:0)

我有一个只有一个textField的简单视图控制器。我想在viewController加载时显示键盘。

问题,在第一个viewController中,我有没有尽头的动画,当我使textField(在另一个viewController中)成为第一响应者,并返回到第一个viewController时,我的动画被阻止了。 (我不知道为什么吗?)

我成为负责这个不需要的动画块的FirstResponder。要解决它:

  1. 正如@Gregg所说:“请等到您的UI工作完成以调用becomeFirstResponder。 然后,我在becomeFirstResponder时调用textField的viewDidAppear
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        if myTextField.canBecomeFirstResponder {
            myTextField.becomeFirstResponder()
        }
    }
  1. 当viewController重新返回时,我需要辞职键盘,然后最好的方法是使用UITextFieldDelegate
    override func viewDidLoad() {
        super.viewDidLoad()
        // set delegate to self, to textFieldDidEndEditing(:) will call by textField
        myTextFiled.delegate = self
    }
    // UITextFieldDelegate method
    func textFieldDidEndEditing(_ textField: UITextField) {
        textField.resignFirstResponder()
    }