iPhone/iPadで自動化するCalayer:どのように?
-
02-10-2019 - |
質問
さまざまな色の勾配で満たされるUiviewサブクラス(「GradientView」)を作成しようとしています。 UiviewのレイヤーのサブレイヤーとしてCagradientLayerを追加することで実装しました。
見た目は良かったが、画面が回転したとき、勾配層のサイズ変更はなかった。トグルするレイヤーにブールプロパティを見つけることができないため、GradientViewのレイアウトサブビューを覆しました。
-(void)layoutSubviews {
self.gradientLayer.frame = self.bounds;
}
これは機能しますが、GradientViewの背後にあるものは、デバイスの回転アニメーション中にまだ表示されます。アニメーションが滑らかになるように、親レイヤーの境界に合わせて(Uiviewの自動化のように)cagradientlayerを「自動化」する最も簡単な方法は何ですか?
解決
おそらく、カスタムuiviewで +layerclassメソッドを定義することで逃げることができます...
@implementation MyGradientView
+(Class) layerClass {
return [CAGradientLayer class];
}
@end
コントローラーのViewDidload()(またはどこでも)のレイヤーを初期化できます。
-(void)viewDidLoad {
[super viewDidLoad];
[(CAGradientLayer*)[mMyGradientViewInstance layer] setColors:nil];
}
他のヒント
私は...するだろう:
増加 あなたのビューのサイズ 最大 の 各 willrotatetointerfaceorientationコードの寸法。 (たとえば、320x480 iPhoneの場合 - DIMSを480x480に設定します)。
didrotatefrominterfaceorientation関数の新しく回転したビューに従って境界を設定します。
これにより、ビューが十分に大きくなるようにする必要があります。これにより、アニメーション中にどのように向いているかに関係なく、画面全体がカバーされます。勾配を回転させる必要があるため、「滑らか」ではありませんが、少なくとも回転の中央のレイヤーの後ろには見えません。
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
CGRect b;
if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation))b = CGRectMake(0, 0, 480, 320);
else b = CGRectMake(0, 0, 320, 480);
[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];
[self.view.layer setBounds:b];
[CATransaction commit];
}
レイヤークラスとしてcagradientlayerを返すことは、ビューの背景色を透明に設定した場合にのみ機能することに注意してください。透明以外の色が必要な場合は、レイヤーの背景色を設定する必要があります。
私の場合、この作業:
[[[view.layer sublayers] objectAtIndex:gradientIndex] setFrame:view.bounds];