2014-01-09 98 views
26

說,我有一個項目,如下所示:,支持自動佈局約束的UIView動畫的變化

enter image description here

有兩個UIView秒 - 一個叫yellowBox,另一個叫redBox。自動佈局約束規定yellowBox距離超級視圖的頂部60個點,其中350點引導和尾隨空格(即,視圖的左側和右側)。 redBox具有相同的前後空白限制。兩個0框之間有一個垂直空間約束,表示yellowBox的底部應始終直接位於redBox的頂部。

當用戶點擊展開黃盒子按鈕,我想yellowBox的高度增加,作爲結果,redBox向下移動,繼續滿足垂直空間的限制(該yellowBox總是在頂部redBox)。這裏是動畫代碼:

- (IBAction)expandYellowBox:(id)sender { 

    [UIView animateWithDuration:0.5 
        animations:^{ 
         CGRect newFrame = self.yellowBox.frame; 
         newFrame.size.height += 50; 
         self.yellowBox.frame = newFrame; 
        }]; 

} 

但是,我一直無法得到這個工作正常。正如你可以通過紅色圖標看,有一個與此刻的約束的問題:

enter image description here

這是不夠公平,因爲沒有辦法自動佈局知道盒子的高度。但是,我不知道如何解決這個問題,以便它可以調整大小和移動框。例如,如果我在yellowBox上指定高度約束,那麼這將防止它被調整大小。如果我設置的高度限制爲大於或等於(允許yellowBox高度增加),那麼我得到不同的約束錯誤:

enter image description here

所有約束已經在故事板使用Xcode的建立 - 沒有編寫代碼。

任何幫助非常感謝。


編輯:事實證明,在yellowBox是當按鈕被點擊增長 - 它只是我不知道,因爲它出現在redBox後面。我只在點擊四次後才注意到它開始出現在redBox的底部。但是,同樣的問題仍然存在 - 如何讓redBox始終堅持到yellowBox的底部。

+0

u能請檢查是否叫烏爾的viewController viewDidLayoutSubViews方法?執行點擊事件時。 – CoolMonster

+0

不,不調用'viewDidLayoutSubViews'方法。 – Skoota

+0

嘗試設置綁定而不是幀可能會工作一段時間。甚至重複self.yellowBox.frame = newFrame;兩次在u代碼也可能會修復一些時間 – CoolMonster

回答

80

嘗試,因爲通過shwet-solanki提及,但改變約束後添加以下行:

[self.view layoutIfNeeded]; 

的IBAction爲會是什麼樣子:

- (IBAction)expandYellowBox:(id)sender { 

[UIView animateWithDuration:0.5 
       animations:^{ 
        self.yellowBoxHeightConstraint.constant += 50; 
        [self.view layoutIfNeeded]; 
       }]; 
} 

哪裏yellowBoxHeightConstraintIBOutlet對於高度約束yellowBox。 希望這有助於。

+0

感謝您的建議,但這是我試圖避免的確切方法。我不想手動調整'redBox'的框架,因爲這應該通過約束來移動。在這種情況下,這是微不足道的,但在這個問題中的例子只是一個測試項目來演示這個問題 - 實際的問題發生在一個更大的項目中,使用您建議的方法不幸是不可行或不可維護的。 – Skoota

+0

我希望你注意到我編輯了我的答案。目前的方法應該工作。請嘗試一下。 – GoGreen

+0

謝謝,這很好。 – Skoota

3
  1. 添加高度約束雙方的意見
  2. 創建一個IBOutlet爲yellowbox
  3. 的高度約束
  4. 現在不是改變yellowbox的高度在按鈕按下事件,而改變高度約束的值。即假設您的IBOutlet約束名稱爲yellowBoxHeightConstraint,則yellowBoxHeightConstraint.constant += 50;

希望這適用於您。

+2

謝謝,這確實擴展了'yellowBox'('redBox'固定在'yellowBox'的底部),但它不會改變動畫 - 它突然發生。 – Skoota

1
// 
// WPViewController.h 
// AutoLayoutTEst 
// 
// Created by VASANTH K on 09/01/14. 
// 
// 

#import <UIKit/UIKit.h> 

@interface WPViewController : UIViewController 
@property (strong, nonatomic) IBOutlet UIButton *button1; 
- (IBAction)buttClicked:(id)sender; 
@property (strong, nonatomic) IBOutlet NSLayoutConstraint *heightConstrain; 

@property (strong, nonatomic) IBOutlet UIButton *button2; 
@end 

Click事件

- (IBAction)buttClicked:(id)sender { 


    self.heightConstrain.constant=100; 


} 

這裏u需要設置heightConstrain的黃色按鈕,然後創建基準出口該按鈕然後更新heightConstrain以更新按鈕的大小,它會自動將向下移動紅色按鈕。

https://github.com/vasanth3008/AutoLayoutHeighDemo

參考我的示例演示項目