2016-09-13 54 views
4

我有一個UIView子類,我添加了一些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:方法'。 – rmaddy

+0

@rmaddy我也是。我的代碼實際上是在編碼器和initWithFrame中調用的共享init方法中。但是因爲我將它添加到故事板中,所以它只是被調用的編碼器。 – Tometoyou

+0

在應用佈局約束後,在layoutSubviews中獲取框架。 –

回答

-2

我的UITableViewCell有同樣的問題。 此解決辦法應該工作

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 
    } 
} 

在你的情況應該是這樣的:

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 
     } 
    } 
}