107

レイヤーにUIView約8つの異なるCALayerサブレイヤーが追加された があります。ビューの境界 (アニメーション化) を変更すると、ビュー自体が縮小します ( で確認しましたbackgroundColor) が、サブレイヤーのサイズは変更されません

これを解決するには?

4

8 に答える 8

157

Solin が使用したのと同じアプローチを使用しましたが、そのコードにはタイプミスがあります。メソッドは次のようにする必要があります。

- (void)layoutSubviews {
  [super layoutSubviews];
  // resize your layers based on the view's new bounds
  mylayer.frame = self.bounds;
}

私の目的のために、私は常にサブレイヤーを親ビューのフル サイズにしたいと考えていました。そのメソッドをビュークラスに入れます。

于 2010-11-04T15:37:03.220 に答える
27

layoutSublayersiPhone の CALayer はレイアウト マネージャーをサポートしていないため、ビューのメイン レイヤーを、すべてのサブレイヤーのフレームを設定するためにオーバーライドするカスタム CALayer サブクラスにする必要があると思います。+layerClassビューのメソッドをオーバーライドして、新しい CALayer サブクラスのクラスを返す必要もあります。

于 2010-03-24T00:40:38.397 に答える
16

これをUIViewで使用しました。

-(void)layoutSublayersOfLayer:(CALayer *)layer
{
    if (layer == self.layer)
    {
        _anySubLayer.frame = layer.bounds;
    }

super.layoutSublayersOfLayer(layer)
}

私のために働きます。

于 2015-02-27T03:39:11.057 に答える
9

私も同じ問題を抱えていました。カスタムビューのレイヤーに、さらに2つのサブレイヤーを追加しました。サブレイヤーのサイズを変更するために(カスタムビューの境界が変更されるたびに)、カスタムビューのメソッドを実装しましたlayoutSubviews。このメソッド内では、サブビューのレイヤーの現在の境界に一致するように、各サブレイヤーのフレームを更新するだけです。

このようなもの:

-(void)layoutSubviews{
   //keep the same origin, just update the width and height
   if(sublayer1!=nil){
      sublayer1.frame = self.layer.bounds;
   }
}
于 2010-07-28T08:21:09.827 に答える
0

カスタム ビューでは、カスタム レイヤーの変数を宣言する必要があります。スコープ 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)
        }
    }
于 2019-10-28T22:58:14.763 に答える