自动布局约束变化并不动画

问题描述:

我从教程自动布局约束变化并不动画

http://weblog.invasivecode.com/post/42362079291/auto-layout-and-core-animation-auto-layout-was

学习与动画自动布局和事情的工作完美。

当我试图在我的应用程序来使用这个概念,试图从底部到顶部动画设定画面(一个UIView),它的伟大工程时,设置屏幕只是一个空的UIView,

但万一我添加一个UILabel作为子视图到这个设置屏幕,动画就消失了。 从设置屏幕删除此UILabel时,动画是可见的。

这里是我已连接

__weak IBOutlet UIView *settingsView; 
__weak IBOutlet NSLayoutConstraint *settingsBottomConstraint; 
__weak IBOutlet NSLayoutConstraint *settingsViewHeightConstraint; 

查看网点没有负载设置方法(setupViews)

-(void)setupViews 
{ 
    settingsBottomConstraint.constant = - settingsViewHeightConstraint.constant; 
    [settingsView setNeedsUpdateConstraints]; 
    [settingsView layoutIfNeeded]; 
    isSettingsHidden = YES; 
} 

隐藏/取消隐藏方法

- (IBAction)showSettingsScreen:(id)sender { 

    if (isSettingsHidden) { 

     settingsBottomConstraint.constant = 0; 
     [settingsView setNeedsUpdateConstraints]; 
     [UIView animateWithDuration:.3 animations:^{ 
      [settingsView layoutIfNeeded]; 
     }]; 
    } 
    else{ 

     settingsBottomConstraint.constant = - settingsViewHeightConstraint.constant; 
     [settingsView setNeedsUpdateConstraints]; 
     [UIView animateWithDuration:0.3 animations:^{ 
      [settingsView layoutIfNeeded]; 
     }]; 

    } 
    isSettingsHidden = !isSettingsHidden; 
} 

我的问题似乎相似 Issue with UIView Auto Layout Animation

+0

你的UILabel有哪些限制? –

+0

@Iftekhar,我试过了两个选项。 1.只需将标签放到UIView中(即不带约束),并且2.将宽度,高度,顶部空间的约束添加到超级视图并导致超级视图。没有工作。 – BangOperator

我找到了答案。

相反的,

[settingsView layoutIfNeeded]; 

这一行做它的工作般的魅力,

[self.view layoutIfNeeded]; 

我想我们需要在我们试图动画父视图不只是视图执行layoutIfNeeded方法。

UPDATE: 如由codyko评论指出的,这需要的iOS 7,iOS装置10。 对于iOS 8,此问题不存在。

+4

请注意[settingsView layoutIfNeeded]适用于iOS8,但不适用于iOS7。在iOS7中,您需要调用[self.view layoutIfNeeded],但如果您只在iOS8中工作,则无需更新整个视图的约束。 – codyko