境界内に不透明な境界線がある半透明の円を示す UIView を作成しようとしています。-[UIView animateWithDuration:animations:]
ブロック内と、1秒間に数回起動するピンチジェスチャ認識アクションの2つの方法で境界を変更できるようにしたいと考えています。SOの他の場所の回答に基づいて3つのアプローチを試しましたが、適切なものはありません。
ビューのレイヤーの角の半径を に設定すると、
layoutSubviews
移動はスムーズになりますが、アニメーション中はビューが円形のままではありません。cornerRadius はアニメーション化できないようです。円を描画する
drawRect:
と一貫して円形のビューが得られますが、円が大きくなりすぎると、デバイスが円を再描画するのに時間がかかりすぎるため、ピンチ ジェスチャでのサイズ変更が不安定になります。CAShapeLayer を追加し、そのパス プロパティを に設定します
layoutSublayersOfLayer
。パスは暗黙的にアニメーション化できないため、UIView アニメーション内ではアニメーション化されません。
一貫して円形でスムーズにサイズ変更可能なビューを作成する方法はありますか? ハードウェア アクセラレーションを利用するために使用できる他のタイプのレイヤーはありますか?
アップデート
-[UIView animateWithDuration:animations:]
ブロック内の境界を変更したいと言ったときに、私が何を意味するかを拡張するようにコメント者から求められました。私のコードには、サークル ビューを含むビューがあります。circle ビュー (cornerRadius を使用するバージョン)-[setBounds:]
は、角の半径を設定するためにオーバーライドします。
-(void)setBounds:(CGRect)bounds
{
self.layer.cornerRadius = fminf(bounds.size.width, bounds.size.height) / 2.0;
[super setBounds:bounds];
}
円ビューの境界は次のように設定され-[layoutSubviews]
ます。
-(void)layoutSubviews
{
// some other layout is performed and circleRadius and circleCenter are
// calculated based on the properties and current size of the view.
self.circleView.bounds = CGRectMake(0, 0, circleRadius*2, circleRadius*2);
self.circleView.center = circleCenter;
}
次のように、アニメーションでビューのサイズが変更されることがあります。
[UIView animateWithDuration:0.33 animations:^(void) {
myView.frame = CGRectMake(x, y, w, h);
[myView setNeedsLayout];
[myView layoutIfNeeded];
}];
しかし、これらのアニメーション中に、コーナー半径を持つレイヤーを使用して円ビューを描画すると、おかしな形になります。アニメーションの長さを layoutSubviews に渡すことができないため、適切なアニメーションを 内に追加する必要があります-[setBounds]
。