2013-03-03 36 views
0

我正在通過NSLayout約束,以編程方式定義複雜的佈局。現在我發現自己處於需要製作其中一個元素的情況。如何以編程方式更改和動畫化NSLayoutConstraints?

我需要動畫視圖crossFadeControlView改變它的高度。這顯然意味着另一個需要動態縮小。那可能嗎?

如果不是......我的選擇是什麼?

下面是我的約束:

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[clipGrid] [sceneLaunchView(==117)][meter(==9)][tempoControl(==58)]|" options:0 metrics:nil views:views]]; 
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[tracksView][meter(==9)][tempoControl(==58)]|" options:0 metrics:nil views:views]]; 
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[crossFadeControlView]|" options:0 metrics:nil views:views]]; 
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[clipGrid]-3-[tracksView(==143)][crossFadeControlView]|" options:0 metrics:nil views:views]]; 
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[sceneLaunchView]-3-[tracksView][crossFadeControlView]|" options:0 metrics:nil views:views]]; 
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tempoControl][crossFadeControlView]|" options:0 metrics:nil views:views]]; 
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[meter][crossFadeControlView]|" options:0 metrics:nil views:views]]; 

回答

0

當然,你可以做到這一點。有點難以告訴你的約束條件是什麼,但是例如,如果你改變crossFadeView的高度,clipGrid會自動縮小,因爲它沒有明確的高度設置,而track視圖會保持其高度,因爲它具有定義的高度。由於相同的原因,screenLaunchView,tempoControl和meter也會自動縮小。

要更改crossFadeView的高度,您必須爲其創建高度約束,然後更改該約束的常量值。我通常在我的動畫塊的正上方執行該操作,然後在動畫塊的superview上調用layoutSubviews。

+0

Thx爲答覆。我如何創建這樣的約束?我應該從已經定義的約束中獲得它嗎?或者我應該創建一個新的約束?如果是這樣,那我怎麼樣?我仍然沒有發現任何讓我朝這個方向發展的東西。 Thx – 2013-03-03 17:06:47

+0

再次。我能夠創建以下約束:[NSLayoutConstraint constraintWithItem:crossFadeControlView屬性:NSLayoutAttributeHeight relatedBy:NSLayoutRelationLessThanOrEqual toItem:tracksView屬性:NSLayoutAttributeHeight乘數:0.5常量:0];我不能讓它有一個0高度。但它已經是動畫了! :) – 2013-03-03 17:39:02

+0

@NunoSantos,好吧,你永遠不會得到它0如果你說它是一半的trackView有一個高度爲143的trackView。如果你不需要它與其他任何東西有關,最簡單的方法是在IB中創建一個高度約束的出口,然後在代碼中改變常量值。 – rdelmar 2013-03-03 22:51:10

相關問題