5

ポップオーバー内のナビゲート可能なビューのiTunes11の動作を再現しようとしています。contentSizeただし、ポップオーバーの変更と同時にアニメーションを実行する方法を見つけることができないようです。

私が持っている基本的なセットアップは、2つのサブビューを持つカスタムビューサブクラスMyPopoverNavigationViewです。ポップオーバー間を移動する古いビューと新しいビューです。ポップオーバーcontentViewControllerには、MyPopoverNavigationViewインスタンスがありますview。私はこれをします:

// Configure constraints how I want them to show the new popover view
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
    [ctx setDuration:0.25];
    [ctx setAllowsImplicitAnimation:YES];
    [self layoutSubtreeIfNeeded];
} completionHandler:nil];

Auto Layout WWDC 2012のビデオからわかる限り、これは、制約の変更の結果としてビューのフレームの変更をアニメーション化するための推奨される方法です。動作しますが、アニメーションは2つのフェーズで発生します。

  • まず、ポップオーバーは、contentSize移動先の新しいビューに対応するように変更されます(そのビューが表示される前に、既存のコンテンツが部分的に隠されます)。
  • 次に、ビューが期待どおりにアニメーション化されるため、インストールした制約システムが満たされます。

-layoutSubtreeIfNeededいくつかのブレークポイントを設定すると、最終的には、と呼ばれるポップオーバーでプライベートメソッドを呼び出すように見えます。_fromConstraintsSetWindowFrame:これは、アニメーショングループの外部でポップオーバーサイズのアニメーションを実行します。私のコンテキストの継続時間は尊重されず、ポップオーバーのサイズ変更が完了するまでアニメーションは実行されません。

ポップオーバーのサイズ変更と一緒にビューをアニメーション化するにはどうすればよいですか?

4

2 に答える 2

4

トリックは、アニメーションと完了ブロックの外側contentSizeにポップオーバーのプロパティを明示的に設定することです。私がまとめたサンプルGitHubプロジェクトの関連するスニペットは、次のようになります。

// Configure constraints for post-navigation view layout
[NSAnimationContext runAnimationGroup:^(NSAnimationContext *ctx) {
    [ctx setDuration:0.25];
    [ctx setAllowsImplicitAnimation:YES];
    [self layoutSubtreeIfNeeded];
} completionHandler:^{
    // Tear down some leftover constraints from before the transition
}];

// Explicitly set popover's contentSize so its animation happens simultaneously
containingPopover.contentSize = postTransitionView.frame.size;
于 2013-02-14T18:10:24.790 に答える
0

これは、Sierraでは問題なく機能します。

let deltaHeight = 8 
let contentSize = popover.contentSize  
NSAnimationContext.runAnimationGroup({ (context) -> Void in
    context.allowsImplicitAnimation = true
    popover.contentSize = NSSize(width: contentSize.width, height: contentSize.height+deltaHeight)
})
于 2017-10-26T06:09:45.323 に答える