2012-02-19 13 views
0

レイヤーマスクを追加して、サブクラスUIViewに丸い角を追加しました。次Montouchコードですが、にObjCでも意味を取得するのに十分簡単なはず:CAShapeLayerをマスクにしたUIViewのサブクラスが正しくアニメーション化されない

// Add a layer that holds the rounded corners. 
UIBezierPath oMaskPath = UIBezierPath.FromRoundedRect (this.Bounds, this.eRoundedCorners, new SizeF (this.fCornerRadius, this.fCornerRadius)); 

private void UpdateMask() 
{   
if(this.Layer.Mask == null) 
{ 
    CAShapeLayer oMaskLayer = new CAShapeLayer(); 
    oMaskLayer.Frame = this.Bounds; 

    // Set the newly created shape layer as the mask for the image view's layer 
    this.Layer.Mask = oMaskLayer; 
} 
((CAShapeLayer)this.Layer.Mask).Path = oMaskPath.CGPath; 
} 

私はFrameプロパティをオーバーロードしています。フレームを設定すると、角が丸くなるようにマスクが調整されます。

フレームサイズの変更をアニメーション化すると、マスクはすぐにアニメーションの宛先値に設定されます。

ビューがアニメーションの一部であることを検出し、マスクを正しくアニメーション化させる方法はありますか?

答えて

1

これは、明示的なアニメーションでCoreAnimationが機能する方法です。

明示的なアニメーションでは、実際には元のオブジェクトの値を変更することはありません。プレゼンテーションレイヤーでオブジェクトをアニメートするだけです。したがって、最後に持っていたい値でアニメーションを開始する前に、オブジェクトが設定されていることを確認する必要があります。

このクラスの問題を解決する方法の完全な説明は、WWDC 2011オンラインビデオの「Core Animation Essentials」で説明されています。セッションを探してください421

+0

私はビデオを見ました。私は明示的なアニメーションを使用していません。私は、UIViewのプロパティを調整していると、これは、層のプロパティの変更で、それはアニメーション化されていません。代わりにUIViewのレイヤーをアニメーション化しようとしました。UIViewのバックレイヤーは決してアニメーション化されません。しかし、暗黙的なアニメーションを使用してCAShapeLayerをアニメーション化することはできますが、同時にUIViewをアニメーション化することもありません。私はここで迷っています...どうすれば両方を組み合わせることができますか? – Krumelur

関連する問題