2013-03-19 147 views
4

我正在爲包含多個子視圖的層次視圖設置動畫效果。一切都使用自動佈局佈局。目前,我動畫視圖,子視圖沒有被縮小與它一起:動畫層次支持視圖時縮放圖層內容

animation

我想整個事情被抽一次,他們的最終尺寸,然後縮放,因爲它的動畫。 layerContentsPlacementlayerContentsRedrawPolicy屬性似乎是我正在尋找,但更改它們似乎沒有任何影響。

這裏是我如何做動畫基本運行通過:

// Add itemView to canvas 
NSView *itemView = // ... 
itemView.layerContentsPlacement = NSViewLayerContentsPlacementScaleProportionallyToFit; 
itemView.layerContentsRedrawPolicy = NSViewLayerContentsRedrawBeforeViewResize; 
[parentView addSubview:itemView]; 

// Add constraints for the final itemView frame ... 

// Layout at final state 
[parentView layoutSubtreeIfNeeded]; 

// Set initial animation state 
itemView.alphaValue = 0.0f; 
itemView.frame = // centered zero'ed frame 

// Set final animation state 
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *context) { 
    context.duration = 0.25f; 
    context.allowsImplicitAnimation = YES; 

    itemView.alphaValue = 1.0f; 
    [parentView layoutSubtreeIfNeeded]; 
} completionHandler:nil]; 
+2

簡答:不要將視圖的大小調整爲動畫。請使用變換對其進行縮放。 – 2013-03-19 19:09:55

回答

4

感謝David的評論,我切換到使用視圖的層上的轉換。

基本的想法是像平常一樣創建和佈局視圖,然後創建一些CA動畫並將其添加到視圖的圖層中。

// Add item view to canvas 
NSView *itemView = // ... 
[parentView addSubview:itemView]; 

// Add constraints for the final item view positioning 

// Layout at final state 
[parentView layoutSubtreeIfNeeded]; 

// Animate 
CABasicAnimation *animation = [CABasicAnimation animation]; 
CATransform3D transform = CATransform3DMakeScale(0.5f, 0.5f, 0.5f); 
animation.fromValue = [NSValue valueWithCATransform3D:transform]; 
animation.duration = 1.0f; 
[itemView.layer addAnimation:animation forKey:@"transform"]; 

// create any other animations...