2017-07-29 39 views
1

我有一個簡單的UIView子類,我製作了@IBDesignable。我過載了init frameinit coder。我的代碼從.xib文件加載視圖說明。 的.xib文件已加載後,我嘗試設置:當IBDesignable加載xib時,未設置view.frame

view.clipsToBounds = true 
view.layer.cornerRadius = frame.size.height/2 

得到一個「矩形與圓形邊」。

問題是當時frame.size.height = 0(加載了.xib後,我的自定義視圖第一次被Interface Builder繪製)。

是否有解決方法?

這是我的代碼:

@IBDesignable 
class CustomUIVIew: UIView { 

    override init(frame: CGRect) { 
     super.init(frame: frame) 
     xibSetup() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
     xibSetup() 
    } 

    private var view: UIView! 
    private let nibName = "CustomUIView" 

    private func xibSetup() { 

     view = loadViewFromNib() 
     view.frame = bounds 
     view.autoresizingMask = [UIViewAutoresizing.flexibleWidth, UIViewAutoresizing.flexibleHeight] 
     addSubview(view) 
     setupView() 
    } 

    private func loadViewFromNib() -> UIView { 

     let bundle = Bundle(for: type(of: self)) 
     let nib = UINib(nibName: nibName, bundle: bundle) 
     let view = nib.instantiate(withOwner: self, options: nil)[0] as! UIView 

     return view 
    } 

    private func setupView() { 

     view.clipsToBounds = true 
     view.layer.cornerRadius = frame.size.height/2 
    } 
} 

謝謝Luca-

回答

2

你應該將任何大小相關的調整到layoutSubviews。通過這種方式,不僅能夠在IB中正確渲染,還能在設備上正確渲染,如果窗口大小發生變化,cornerRadius也會相應地進行調整。

1

prepareForInterfaceBuilder做的工作

override func prepareForInterfaceBuilder() { 
    view.clipsToBounds = true 
    view.layer.cornerRadius = bounds.height/2 
}