iOS键盘会破坏所有动画

时间:2014-10-23 08:53:33

标签: ios objective-c animation keyboard

我有一个专门用于登录过程的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移回原来的状态,同时将其隐藏起来。但这听起来像一个糟糕的设计。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

我确认问题的根源在于autolayout。我正在使用动画移动的视图被放置在具有约束的superview中。看起来当键盘即将显示(或确实显示,确实不确定何时) -layoutIfNeeded / -layoutSubviews 被调用并且帧更新以匹配其约束。我的loginView被移开而没有改变它的约束,因此每当调用键盘时它都被带回来,但是我的动画代码仍在考虑这个视图移出屏幕。我希望有一天能为某人解决同样的问题并节省一些时间。

正确的方法是在移动内容并使用autolayout时更新(删除/添加新的)约束。或者您最初可以使用 -initWithFrame:

定位视图