2

現在、含まれているビューのアルファを 0 に設定するアニメーションを実行している iOS があります。次のようなものです。

[UIView animateWithDuration:1.0f animations:^{
 self.jtContained.view.alpha = 1.0f;
}];

self.jtContained は、コンテナー コントローラーの下半分を表す包含コントローラーです。これにより、この含まれているコントローラーのすべてのタッチ機能が削除されます。このコンテインメント コントローラーに実質的にアニメーション化されたマスクを配置する方がより直感的である可能性があると考えています。これは、必要なものの 5 分間の簡単なフォトショップです (つまり、アニメーション化するのではなく、含まれているコントローラーをマスクします)。

ここに画像の説明を入力

UIView アニメーションまたはコア アニメーションのいずれかを使用してこれを行う事前に構築された方法はありますか? ビューを反復処理してピクセルを 0 に設定することさえ考えていました。素朴な質問で申し訳ありませんが、コア アニメーションのドキュメントのいくつかが圧倒されます。

thx事前に

4

2 に答える 2

2

あなたがしたいのは、CAShapeLayerを作成し、それをビューのレイヤーのマスクレイヤーにすることです。次に、ビューのフルサイズであるCGPathをシェイプレイヤーに追加します。(ビューの1つのコーナーから始まり、円を描いてコーナーを移動するパスを作成し、長方形のパスを作成します。)

ビューをマスクしたい場合は、パスを面積がゼロの別の長方形のパスに置き換えます。(最初のパスは、top_left、top_right、bottom_right、bottom_left、closeから角を曲がる可能性があります。空のパスはtop_left、top_right、top_left、top_right、closeになります。)

Core Animationは、シェイプレイヤーを定義するパスへの変更をアニメーション化します。パスはビューのレイヤーのマスクであるため、マスクはアニメーション化してビューを非表示にします。

これを正しくアニメートするための重要な点は、開始パスと終了パスのポイント数が同じでなければならないことです。そのため、4ポイントパスと別のEMPTY4ポイントパスの作成について説明します。これを行うと、Core Animationがポイントの動きをアニメーション化し、必要な効果を得ることができます。開始パスと終了パスのコントロールポイントの数が異なる場合、またはコントロールポイントの順序が異なる場合、「結果は未定義」であり、通常はまったく必要ありません。

あなたが求めているのは、明らかにするアニメーションです。これは、私が上で説明したものの逆になります。

githubにiOS-CAAnimation-group-demo(リンク)というアイデアを示すデモプロジェクトがあります。「アニメーションのマスク」ボタンの背後にあるコードを見てください。そのコードは「クロックワイプ」アニメーションを作成します。これは、実行したい単純な公開よりもはるかに複雑です。

PSこの投稿が役に立った場合は、質問に回答するものとしてマークすることを忘れないでください(そして賛成票を投じてください)。

于 2013-02-23T21:39:51.500 に答える
2

以前の回答を詳しく説明するには、マスクに使用される CALayer のフレームをアニメーション化することでこれを行うことができます。長方形のマスクだけにする場合は、CGPath は必要ありません。非表示にするビューのフレームを再利用するだけです。例:

// Get the frame of the view's layer we're going to mask
let frame = viewToHide.layer.frame

// Create a new layer for our mask
// Masks are based on the "alpha" of the layer so if there is no background
// the mask won't cover anything so need to make sure we set that.
let mask = CALayer()
mask.backgroundColor = UIColor.whiteColor().CGColor
mask.frame = CGRectMake(0.0, 0.0, frame.width, frame.height)

// Set our new layer as the mask of the view we want to hide.
self.viewToHide.layer.mask = mask

UIView.animateWithDuration(1.0, animations: {() -> Void in

    // We keep the width of the new frame the same so
    // it looks like it's "rolling" up. Then we change the
    // height to 0.0, effectively making the mask not cover anything
    mask.frame = CGRectMake(0.0, 0.0, frame.width, 0.0)
})
于 2015-11-29T20:45:36.027 に答える