约束动画未按预期进行动画处理

时间:2019-04-14 10:45:21

标签: animation uiviewcontroller constraints

以下代码用于将文本字段位置移动到应用程序上的编辑位置。 不幸的是,它没有产生预期的效果。

textfield1在X中移至其完成位置,然后在y中移至其完成位置。

我希望两个约束都能产生文本字段的对角线运动,但是在iPhone上测试时不起作用。

动画有效,但最终我得到了反向的“ L”形运动,而不是对角的“ \”运动

任何解决此问题的建议将不胜感激。

    -(void)textFieldEditingPosition
{
    NSLog(@"editing");
[_regular setNeedsUpdateConstraints];
    switch (_activeTextField.tag)
    {
        case 1:
            self.textField2WidthConstraint.constant =_regular.frame.size.width/4 -16;
            self.textField2XConstraint.constant = -_regular.frame.size.width/4 - self.textField2WidthConstraint.constant/2 -8;
            self.textField2YConstraint.constant = -(_regular.frame.size.height/2 -_inputView.frame.size.height/2);

            _textField1YConstraint.constant = 0;
            _textField1XConstraint.constant = 0;
            _textField1WidthConstraint.constant = _placeHolderTextfield.frame.size.width;

            break;
        case 2:
            self.textField1XConstraint.constant = (_regular.frame.size.width /4) /2;
            self.textField1YConstraint.constant = -(_regular.frame.size.height/8 -8) ;
            self.textField1WidthConstraint.constant = _regular.frame.size.width/4 * 3 -16;

            self.textField2YConstraint.constant =0;
            self.textField2XConstraint.constant = 0;
            self.textField2WidthConstraint.constant = _placeHolderTextfield.frame.size.width;
            break;

        default:
            break;
    }
            [UIView animateWithDuration:0.7
                                  delay: 0.0
                                options: UIViewAnimationOptionCurveEaseInOut
                             animations:^{
                                [self.view layoutIfNeeded];
                             }
                             completion:nil];

}

1 个答案:

答案 0 :(得分:0)

我设法解决了以下问题

首先,我在模拟器中打开慢速动画。

这使我能够准确地了解正在发生的事情。 我看到的L形运动实际上是由于文本框移动到新的x和y位置时文本框宽度扩大而引起的错觉。

这种扩展宽度抵消了我期望看到的x方向的运动。

通过将宽度扩展分成动画完成,我得到了所需的结果,即文本框向编辑位置的对角移动。

文本框宽度的扩展发生在没有动画的补全块中,这对我来说很好,因为文本框背景被隐藏了,并且用户只能看到占位符文本。

以及修改后的代码:

-(void)textFieldEditingPosition
{
    NSLog(@"editing");
    [_regular setNeedsUpdateConstraints];

    switch (_activeTextField.tag)
    {
        case 1:{
            self.textField2WidthConstraint.constant =_regular.frame.size.width/4 -16;
            self.textField2XConstraint.constant = -_regular.frame.size.width/4 - self.textField2WidthConstraint.constant/2 -8;
            self.textField2YConstraint.constant = -(_regular.frame.size.height/2 -_inputView.frame.size.height/2);

            _textField1YConstraint.constant = 0;
            _textField1XConstraint.constant = 0;
            [UIView animateWithDuration:0.7
                                  delay: 0.0
                                options: UIViewAnimationOptionBeginFromCurrentState
                             animations:^{
                                 [self.regular layoutIfNeeded];
                             }
                             completion:^(BOOL finished){
                                 self->_textField1WidthConstraint.constant = self->_placeHolderTextfield.frame.size.width;
                                 [self.regular layoutIfNeeded];}];
        }
            break;
        case 2:{
            self.textField1XConstraint.constant = (_regular.frame.size.width /4) /2;
            self.textField1YConstraint.constant = -(_regular.frame.size.height/8 -8) ;
            self.textField1WidthConstraint.constant = _regular.frame.size.width/4 * 3 -16;

            self.textField2YConstraint.constant =0;
            self.textField2XConstraint.constant = 0;

            [UIView animateWithDuration:0.7
                                  delay: 0.0
                                options: UIViewAnimationOptionBeginFromCurrentState
                             animations:^{
                                 [self.regular layoutIfNeeded];
                             }
                             completion:^(BOOL finished){
                                 self->_textField2WidthConstraint.constant = self->_placeHolderTextfield.frame.size.width;
                                                  [self.regular layoutIfNeeded];}];
        }
            break;

        default:
            break;
    }


}

我敢肯定有一种更简洁的编码方式,但是它可以工作,所以我放心了

谢谢