2016-09-13 8 views
4

私はUIプラントのサブクラスを追加していますが、これにはCALayersを追加しています。私はこれをUIViewをストーリーボード経由で私のビューに追加しました。なんらかの理由で、init(およびawakeFromNib)のフレームおよび境界へのアクセスは常に(0、0、1000、1000)です。どうしてこれなの?UIViewのフレームと境界が間違っています

class SliderView: UIView { 
    let trackLayer = CAShapeLayer() 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     // The bounds are wrong 
     trackLayer.path = UIBezierPath(roundedRect: self.bounds, cornerRadius: 15).cgPath 

    } 
} 
+0

を 'initWithFrameをオーバーライドしてみてください:' この回避策は、次のようになりますあなたの場合は

override func drawRect(rect: CGRect) { super.drawRect(rect) customInit() } var initialized = false func customInit(){ if !initialized{ initialized = true // Bounds will be good. Do your stuff here } } 

を動作するはずです。 – rmaddy

+0

@rmaddy私もそれをしました。私のコードは実際には、両方のコーダーとinitWithFrameから呼び出される共有initメソッドにあります。しかし、私はストーリーボードに追加しているので、呼び出されるのはこれまでのコーダーだけです。 – Tometoyou

+0

レイアウト制約が適用された後、layoutSubviewsでフレームを取得します。 –

答えて

-2

私はUITableViewCellで同じ問題がありました。

class SliderView: UIView { 
    let trackLayer = CAShapeLayer() 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     // The bounds are wrong 
    } 

    override func drawRect(rect: CGRect) { 
     super.drawRect(rect) 
     customInit() 
    } 

    var initialized = false 
    func customInit() { 
     if !initialized { 
      initialized = true 

      // Bounds will be good. 
      trackLayer.path = UIBezierPath(roundedRect: self.bounds, cornerRadius: 15).CGPath 
     } 
    } 
} 
関連する問題