レイヤーにUIView
約8つの異なるCALayer
サブレイヤーが追加された があります。ビューの境界 (アニメーション化) を変更すると、ビュー自体が縮小します ( で確認しましたbackgroundColor
) が、サブレイヤーのサイズは変更されません。
これを解決するには?
レイヤーにUIView
約8つの異なるCALayer
サブレイヤーが追加された があります。ビューの境界 (アニメーション化) を変更すると、ビュー自体が縮小します ( で確認しましたbackgroundColor
) が、サブレイヤーのサイズは変更されません。
これを解決するには?
Solin が使用したのと同じアプローチを使用しましたが、そのコードにはタイプミスがあります。メソッドは次のようにする必要があります。
- (void)layoutSubviews {
[super layoutSubviews];
// resize your layers based on the view's new bounds
mylayer.frame = self.bounds;
}
私の目的のために、私は常にサブレイヤーを親ビューのフル サイズにしたいと考えていました。そのメソッドをビュークラスに入れます。
layoutSublayers
iPhone の CALayer はレイアウト マネージャーをサポートしていないため、ビューのメイン レイヤーを、すべてのサブレイヤーのフレームを設定するためにオーバーライドするカスタム CALayer サブクラスにする必要があると思います。+layerClass
ビューのメソッドをオーバーライドして、新しい CALayer サブクラスのクラスを返す必要もあります。
これをUIViewで使用しました。
-(void)layoutSublayersOfLayer:(CALayer *)layer
{
if (layer == self.layer)
{
_anySubLayer.frame = layer.bounds;
}
super.layoutSublayersOfLayer(layer)
}
私のために働きます。
私も同じ問題を抱えていました。カスタムビューのレイヤーに、さらに2つのサブレイヤーを追加しました。サブレイヤーのサイズを変更するために(カスタムビューの境界が変更されるたびに)、カスタムビューのメソッドを実装しましたlayoutSubviews
。このメソッド内では、サブビューのレイヤーの現在の境界に一致するように、各サブレイヤーのフレームを更新するだけです。
このようなもの:
-(void)layoutSubviews{
//keep the same origin, just update the width and height
if(sublayer1!=nil){
sublayer1.frame = self.layer.bounds;
}
}
カスタム ビューでは、カスタム レイヤーの変数を宣言する必要があります。スコープ init で変数を宣言しないでください。一度だけ初期化します。null 値を設定して再初期化しないでください。
クラス CustomView:UIView { var customLayer:CALayer = CALayer() オーバーライド func layoutSubviews() { super.layoutSubviews() // ガード let _fillColor = self._fillColor else {return} initializeLayout() } プライベート関数 initializeLayout() { customLayer.removeFromSuperView() customLayer.frame = layer.bounds layer.insertSubview(at:0) } }