2017-07-29 98 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 
}