2014-04-12 70 views
9

我從教程自動佈局約束變化並不動畫

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

回答

32

我找到了答案。

相反的,

[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