我有一个专门用于登录过程的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定位视图: