2016-02-05 70 views
1

我正在構建一個應用程序,而我正面臨一個有約束的奇怪問題。約束動畫問題

我試圖給連線到故事板中UIView的高度約束設置動畫,但模擬器顯示一些奇怪的行爲。爲了調試,我創建了一個全新的iOS 9.2項目,並添加了一個UIButton,爲它設置了一個水平針腳和超級頂視圖頂端約束,將頂部約束與我的頭文件和按鈕本身鏈接到IBAction

當單獨調用此代碼:

- (IBAction)myAction:(id)sender { 
    self.topConstraint.constant += 150.0f; 
} 

按鈕釦150分的情況下,即使沒有調用[self.view layoutIfNeeded];

然而,當我使用這個代碼:

- (IBAction)myAction:(id)sender { 
    self.topConstraint.constant += 150.0f; 
    [self.view setNeedsUpdateConstraints]; 
    [UIView animateWithDuration:1 animations:^{ 
     [self.view layoutIfNeeded]; 
    }]; 
} 

按鈕向下滑動。

當沒有動畫塊時,如何在沒有我的情況下調用layoutIfNeeded我覺得這很奇怪。

這是我的頭文件:

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController 

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topConstraint; 

@end 

而且我最NSLayoutConstraint設置:

enter image description here

而且在Interface Builder中UIViewControllerenter image description here

+0

當你需要佈局時,你不需要調用set needsto更新約束! –

+0

@T先生,我明白了 - 我會改變它的。感謝您的反饋。你知道我爲什麼面臨的問題正在發生嗎? – Erik

回答

1

調用layoutIfNeeded一個視圖僅僅儘早強制更新視圖等待通過繪製週期進行更新,當您爲約束設置動畫時,您將layoutIfNeeded放置在動畫塊內,從而爲更改生成動畫,在第二個實例中,您不調用layoutIfNeeded,繪製週期到來並更新視圖動畫。

+0

我明白了。將更改後的代碼放在動畫塊內的佈局「layoutIfNeeded」更合適嗎? – Erik

+0

我很困惑,如果你想讓它「捕捉」,只設置常量,如果你想動畫改變常量並在同一個方法中調用動畫塊內的layoutIfNeeded。 – SeanLintern88

+0

我希望它具有動畫效果,但是您的評論回答了您的問題。我想知道是否應該在同一個動畫塊中調用'layoutIfNeeded'來改變常量 – Erik