レイヤーに約8つの異なるUIView
サブレイヤーが追加されたCALayer
があります。 ビューの境界を変更する(アニメーション)の場合、ビュー自体は縮小します(backgroundColor
で確認しました)、しかしサブレイヤーのサイズは変更されません 。
これを解決するには?
私はSolinが使用したのと同じアプローチを使用しましたが、そのコードにはタイプミスがあります。メソッドは次のとおりです。
- (void)layoutSubviews {
[super layoutSubviews];
// resize your layers based on the view's new bounds
mylayer.frame = self.bounds;
}
私の目的のために、私は常にサブレイヤーを親ビューのフルサイズにしたかったのです。そのメソッドをビュークラスに配置します。
IPhoneのCALayerはレイアウトマネージャーをサポートしていないため、ビューのメインレイヤーをlayoutSublayers
をオーバーライドしてすべてのサブレイヤーのフレームを設定するカスタム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;
}
}
この質問に対する文字通りの答え:
良くも悪くも
needsDisplayOnBoundsChange
CALayer
のデフォルトはfalseです。
解決、
class CircularGradientViewLayer: CALayer {
override init() {
super.init()
needsDisplayOnBoundsChange = true
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override open func draw(in ctx: CGContext) {
go crazy drawing in .bounds
}
}
確かに、私はあなたにこのQAを指示します
https://stackoverflow.com/a/47760444/294884
これは、重大なcontentsScale
設定が何をするのかを説明しています。通常、needsDisplayOnBoundsChangeを設定するときに、それを等しく設定する必要があります。
Swift 3バージョン
カスタムセルで、次の行を追加
最初に宣言する
let gradientLayer: CAGradientLayer = CAGradientLayer()
次に、次の行を追加します
override func layoutSubviews() {
gradientLayer.frame = self.YourCustomView.bounds
}
[Ole]が書いたように、CALayerはiOSでの自動サイズ変更をサポートしていません。そのため、レイアウトを手動で調整する必要があります。私のオプションは、レイヤーのフレームを調整することでした(iOS 7以前)
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
または(iOS 8以降)
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerTransitionCoordinator>)coordinato