5

複数のサブビューを含むレイヤー付きビューをアニメーション化しています。すべてが自動レイアウトを使用してレイアウトされます。現在、ビューをアニメーション化すると、サブビューはそれに合わせてスケーリングされません。

アニメーション

全体を最終的なサイズで一度描画してから、アニメーションに合わせてスケーリングしたいと思います。layerContentsPlacementとプロパティは私が探しているもののlayerContentsRedrawPolicyようですが、それらを変更しても効果がないようです。

アニメーションの実行方法の基本的な概要は次のとおりです。

// 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];
4

1 に答える 1

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...
于 2013-03-20T16:50:28.860 に答える