レイヤーに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;
}
私の目的のために、私は常にサブレイヤーを親ビューのフル サイズにしたいと考えていました。そのメソッドをビュークラスに入れます。
layoutSublayersiPhone の 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)
}
}