2017-03-03 5 views
4

私は、目標が何か対して私が現在起こっていることを示すテストプロジェクトを作りました。左のGIFは、終わりの外観が欲しいものを正確に示しています。従来の単一のビュー階層で構成されています。私はピンクのビューan embedded/contained viewでこれを達成する必要があります。これまでの私の試みは、私は右のGIFにしか通じていませんでした。本質的にサイズの変更されたビューブレークアニメーションを組み込む

青いサブビューは高さを変更し、すべての接続された垂直方向の制約のために装置全体が新しい固有サイズを取得します。期待どおり、これは私の実際のアプリの単純化ですが、私はそれはすべての重要なビットがあると思います。

Ideal visual outcome: Smooth animation of both the contained view and it's siblings in the containing context As is: The inner parts of the contained view animate well, but the sibling view does not animate.

奇妙です、私が見る主なもの:

  1. は黄色/オレンジ色の "その他" のビューは、すべてのアニメーション表示されていません。ここで Before and after the animation, the frame has the same origin

:ここに示されているよう

  • ビューはそれ自身の部分がきれいにアニメーションされるが、それはそれはフレームだとしても、位置だアニメーション化されて含まれているピンクのアニメーションの前後に同じ起源を持っています右のgifのストーリーボード。 「親」シーンのコンテナビューと「子」シーンのトップビューの両方は、実行時属性でtranslatesAutoresizingMaskIntoConstraintsがfalseに設定されています。その後、

    Xcode storyboard showing embedded view setup and constraints

    質問:**私は本質的にサイズや含まれるビューのサイズ変更がある場合、影響を受けるすべてのレイアウトの変更が(適切に)アニメーション化する得るために、私の設定について何を変更する必要がありますか? **

    編集: が質問を投稿しているので、私は手動ビューコントローラ封じ込め戦略を試してみました、と私は最終的にのために良い兆候であるストーリーボード技術、のようにまったく同じ結果を得たしようとしたマニュアル埋め込みプラットフォーム。階層全体ではビューが1つ少なくなりましたが、違いは見られませんでした。

    編集:Bounty and project 私は注目を集めるために100ポイントの賞金を追加しました。サンプルプロジェクトをthis github repoにアップロードしました。見てみな!

  • 答えて

    1

    InnerViewControllerのアニメーションブロックを次のように変更すると、そのトリックが実行されます。

    var isCollapsed = false { 
        didSet { 
         let factor:CGFloat = isCollapsed ? 1.5 : 0.66 
         let existing = innerViewHeightConstraint.constant 
         UIView.animate(withDuration: 1.0) { 
          self.innerViewHeightConstraint.constant = existing * factor 
          self.view.layoutIfNeeded() 
          self.parent?.view.layoutIfNeeded() 
         } 
        } 
    } 
    

    主な違いは、代わりにすぐにアニメーションの開始前の、アニメーションの一部として、制約を更新するための埋め込みビューコントローラに指示self.parent?.view.layoutIfNeeded()、です。

    +0

    ありがとうサム!私はこれをバブリングする必要がありました(私の実際のプロジェクトでは、いくつかの封じ込めレベルがあります)。これをUIVC拡張モジュールにラップしました: 'func bubbleLayoutIfNeeded(){ view.layoutIfNeeded() parent?.bubbleLayoutIfNeeded() } –

    関連する問題