我有一个专门用于登录过程的View Controller。它有两个独立的视图,分为两个阶段。可悲的是,我不允许发布图片,这会更容易解释。
隐藏第一个视图并显示第二个视图的动画过程。首先按一下按钮。在第二个视图(仅在过渡动画之后出现)有一个文本字段。一切正常,直到键盘出现。
如果用户在屏幕上的任何位置按下
,我会使用此代码解除键盘-(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:
我知道可能导致问题的原因。我在这个场景中使用autolayout。看起来当键盘显示自动布局更新移动视图的位置时。
此可移动视图(_welcomeView)内的所有内容都使用自动布局定位。我可以使用代码定位_welcomeView,但是如果我删除了这个_welcomeView的约束,它将会破坏所有子视图的自动布局。
解决这个问题的唯一方法就是在动画完成后将_welcomeView移回原来的状态,同时将其隐藏起来。但这听起来像一个糟糕的设计。有什么想法吗?
答案 0 :(得分:1)
我确认问题的根源在于autolayout。我正在使用动画移动的视图被放置在具有约束的superview中。看起来当键盘即将显示(或确实显示,确实不确定何时) -layoutIfNeeded / -layoutSubviews 被调用并且帧更新以匹配其约束。我的loginView被移开而没有改变它的约束,因此每当调用键盘时它都被带回来,但是我的动画代码仍在考虑这个视图移出屏幕。我希望有一天能为某人解决同样的问题并节省一些时间。
正确的方法是在移动内容并使用autolayout时更新(删除/添加新的)约束。或者您最初可以使用 -initWithFrame:
定位视图