我有一个专门用于登录过程的View Controller。对于该过程的2个阶段,它具有2个单独的视图。遗憾的是,我不被允许发布图片,这本来会更容易解释。

有一个动画过程可以隐藏第一个视图并显示第二个视图。它从按下按钮开始。在第二个视图(仅在过渡动画之后出现)上有一个文本字段。一切正常,直到出现键盘。

如果用户在屏幕上的任意位置按下,我将使用此代码关闭键盘

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.view endEditing:YES];
}


如果“键盘”曾经出现在屏幕上并被关闭,则后动画会出现故障。我当前的视图消失了,但是另一个视图却没有出现。如果您不触摸键盘,则一切正常。动画非常简单

[UIView animateWithDuration]


我使一个视图不可见,而另一个视图移入/移出屏幕侧面。

有人遇到过类似的问题吗?知道为什么会这样吗?我如何寻找可能的原因?

更新:

动画代码:

- (IBAction)backButtonPressed:(id)sender {

//prepare for animations
// [self.view endEditing:YES];


[UIView animateWithDuration:kHIDE_ANIMATION_DURATION
                 animations:^{

                     //hide current view
                     _loginView.alpha = 0;


                     //waves animation
                     //----------------------------------------------------------------------------------------
                     [UIView animateWithDuration:kWAVES_ANIMATION_DURATION
                                           delay:0
                          usingSpringWithDamping:1
                           initialSpringVelocity:0
                                         options:UIViewAnimationOptionOverrideInheritedDuration
                                      animations:^{

                                          CGPoint center = _waves.center;
                                          center.y -= _waves.frame.size.height/4;
                                          _waves.center = center;

                                      }
                                      completion:nil];
                     //----------------------------------------------------------------------------------------



                 }
                 completion:^(BOOL finished){

                     NSLog(@"Back_Button_Starts_Complition_Block");
                     [UIView animateWithDuration:kMOVE_ANIMATION_DURATION
                                      animations:^{

                          //clean up
                         _loginView.hidden = YES;

                         //show next view
                         CGPoint center = _welcomeView.center;
                         center.x += self.view.bounds.size.width;
                         _welcomeView.center = center;

                     }];


                 }];

}


更新2:

我有什么可能会导致问题的想法。我在这个场景中使用了自动布局,好像当键盘显示自动布局时更新了移动视图的位置。

此可移动视图(_welcomeView)内的所有内容均使用自动布局进行定位。我本可以使用代码定位_welcomeView,但是如果我删除此_welcomeView的约束,它将破坏其所有子视图的自动布局。

我想到的唯一解决此问题的方法是在动画完成后且不可见时将_welcomeView移回。但这听起来像是一个糟糕的设计。有任何想法吗?

最佳答案

我确认问题的根源在于自动布局。我随动画一起移动的视图被置于带有约束的超级视图内。似乎当键盘即将显示(或确实显示,不确定确切的时间)时,将调用-layoutIfNeeded / -layoutSubviews并更新框架以匹配其约束。我的loginView移开了,没有改变其约束,因此无论何时调用键盘,它都会被带回,但是我的动画代码仍在考虑将该视图移出屏幕。我希望这将有一天为某人解决同样的问题,并帮助节省一些时间。

正确的方法是在移动某些东西并使用自动布局时更新(删除/添加新的)约束。或者,您本来可以使用-initWithFrame定位视图:

10-06 13:25
查看更多