我有一個UIView與子視圖,並希望只動畫某些視圖的特定屬性。例如,我有時想調用[self layoutIfNeeded]
,並且只對邊界進行動畫處理,而不是視圖或其子視圖的其他屬性。範圍UIView動畫到特定的視圖或屬性
問題是+[UIView animateWithDuration:animations]
跟蹤子視圖和所有動畫屬性。有沒有合理的解決方案?
我有一個UIView與子視圖,並希望只動畫某些視圖的特定屬性。例如,我有時想調用[self layoutIfNeeded]
,並且只對邊界進行動畫處理,而不是視圖或其子視圖的其他屬性。範圍UIView動畫到特定的視圖或屬性
問題是+[UIView animateWithDuration:animations]
跟蹤子視圖和所有動畫屬性。有沒有合理的解決方案?
看看+[UIView performWithoutAnimation:]
。您可以指定一組您希望在沒有動畫的情況下執行的更改,並立即執行。
這適用於iOS7及以上版本,並且僅適用於UIKit動畫。對於直接在層對象的動畫,或支持用於處理舊版iOS,您可以使用下面的代碼:
[CATransaction begin];
[CATransaction setDisableActions:YES];
//Perform any changes that you do not want to be animated
[CATransaction commit];
更多關於performWithoutAnimation:
here和setDisabledActions:
here。
如果您不希望改變父母的代碼,你可以實現你不希望動畫屬性的setter方法,並與performWithoutAnimation:
包裹超級調用,就像這樣:
- (void)setFrame:(CGRect)frame
{
[UIView performWithoutAnimation:^{
[super setFrame:frame];
}];
}
如果您不希望子視圖在父視圖邊界更改時調整大小,則應該適當地設置每個子視圖autoresizingMask
和/或設置父級的autoresizesSubviews
標誌。
否則,您必須覆蓋父項的layoutSubviews
並將每個子視圖的框架修改爲其先前的值。
既然你想做一些比移動視圖更復雜的東西,我絕對建議你從UIKit降級到Core Animation。這將允許您爲每個對象的特定鍵路徑創建動畫。
我保證沒有那麼可怕,通過創建一些CABasicAnimations並將它們組合在CAAnimationGroup中,您可以將它們添加到任何UIView的CALayer中。這肯定會提供您需要的控制。
有沒有一種方法來啓用/禁用動畫的特定屬性?例如,'[self layoutIfNeeded]'改變了視圖的框架,但也改變了它的子視圖的框架。我想告訴UIKit只動畫父視圖,而不動畫子視圖,而不修改父視圖的實現。 – ide
@ide您可以修改'setXXX:'的子視圖實現,將其包含在'performWithoutAnimation:'塊中。請參閱編輯以回答。 –