回答:
私はSolinが使用したのと同じアプローチを使用しましたが、そのコードにはタイプミスがあります。メソッドは次のとおりです。
- (void)layoutSubviews {
[super layoutSubviews];
// resize your layers based on the view's new bounds
mylayer.frame = self.bounds;
}
私の目的のために、私は常にサブレイヤーを親ビューのフルサイズにすることを望んでいました。そのメソッドをビュークラスに配置します。
UITextView
(scrollEnabled = NO)と自動レイアウトでは、うまく機能しませんでした。テキストビューをスーパービューに固定しました。スーパービューCALayer
は下部に(ボーダー)があり、テキストビューの高さが変更されたときにボーダーの位置を更新したいと思いました。なんらかの理由layoutSubiews
で呼び出されるのが遅すぎた(そしてレイヤーの位置がアニメーション化された)。
iPhoneのCALayerはレイアウトマネージャーをサポートしていないので、ビューのメインレイヤーを、layoutSublayers
すべてのサブレイヤーのフレームを設定するためにオーバーライドするカスタムCALayerサブクラスにする必要があると思います。+layerClass
新しいCALayerサブクラスのクラスを返すには、ビューのメソッドもオーバーライドする必要があります。
これをUIViewで使用しました。
-(void)layoutSublayersOfLayer:(CALayer *)layer
{
if (layer == self.layer)
{
_anySubLayer.frame = layer.bounds;
}
super.layoutSublayersOfLayer(layer)
}
私のために働く。
CALayerDelegate
のdraw(_:in:)
)、私はまた、呼び出す必要がありました_anySubLayer.setNeedsDisplay()
。その後、これは私のために働いた。
私も同じ問題を抱えていました。カスタムビューのレイヤーに、さらに2つのサブレイヤーを追加しました。(カスタムビューの境界が変更されるたびに)サブレイヤーのサイズを変更するために、カスタムビューのメソッドを実装しましたlayoutSubviews
。このメソッド内では、サブビューのレイヤーの現在の境界に一致するように各サブレイヤーのフレームを更新します。
このようなもの:
-(void)layoutSubviews{
//keep the same origin, just update the width and height
if(sublayer1!=nil){
sublayer1.frame = self.layer.bounds;
}
}
この質問に対する文字通りの答え:
良くも悪くも
needsDisplayOnBoundsChange
デフォルトではfalse CALayer
。
解決、
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
カスタムビューでは、カスタムレイヤーの変数を宣言する必要があります。スコープのinitで変数を宣言しないでください。そして一度だけそれを初期化し、null値を設定して再初期化しないでください
クラスCustomView:UIView { var customLayer:CALayer = CALayer() func layoutSubviews(){ super.layoutSubviews() //ガードlet _fillColor = self._fillColor else {return} initializeLayout() } プライベートfunc initializeLayout(){ customLayer.removeFromSuperView() customLayer.frame = layer.bounds layer.insertSubview(at:0) } }