2014-03-25 25 views
7

我有一個UIView與子視圖,並希望只動畫某些視圖的特定屬性。例如,我有時想調用[self layoutIfNeeded],並且只對邊界進行動畫處理,而不是視圖或其子視圖的其他屬性。範圍UIView動畫到特定的視圖或屬性

問題是+[UIView animateWithDuration:animations]跟蹤子視圖和所有動畫屬性。有沒有合理的解決方案?

回答

10

看看+[UIView performWithoutAnimation:]。您可以指定一組您希望在沒有動畫的情況下執行的更改,並立即執行。

這適用於iOS7及以上版本,並且僅適用於UIKit動畫。對於直接在層對象的動畫,或支持用於處理舊版iOS,您可以使用下面的代碼:

[CATransaction begin]; 
[CATransaction setDisableActions:YES]; 
//Perform any changes that you do not want to be animated 
[CATransaction commit]; 

更多關於performWithoutAnimation:heresetDisabledActions:here


如果您不希望改變父母的代碼,你可以實現你不希望動畫屬性的setter方法,並與performWithoutAnimation:包裹超級調用,就像這樣:

- (void)setFrame:(CGRect)frame 
{ 
    [UIView performWithoutAnimation:^{ 
     [super setFrame:frame]; 
    }]; 
} 
+0

有沒有一種方法來啓用/禁用動畫的特定屬性?例如,'[self layoutIfNeeded]'改變了視圖的框架,但也改變了它的子視圖的框架。我想告訴UIKit只動畫父視圖,而不動畫子視圖,而不修改父視圖的實現。 – ide

+0

@ide您可以修改'setXXX:'的子視圖實現,將其包含在'performWithoutAnimation:'塊中。請參閱編輯以回答。 –

1

如果您不希望子視圖在父視圖邊界更改時調整大小,則應該適當地設置每個子視圖autoresizingMask和/或設置父級的autoresizesSubviews標誌。

否則,您必須覆蓋父項的layoutSubviews並將每個子視圖的框架修改爲其先前的值。

1

既然你想做一些比移動視圖更復雜的東西,我絕對建議你從UIKit降級到Core Animation。這將允許您爲每個對象的特定鍵路徑創建動畫。

我保證沒有那麼可怕,通過創建一些CABasicAnimations並將它們組合在CAAnimationGroup中,您可以將它們添加到任何UIView的CALayer中。這肯定會提供您需要的控制。