2017-07-29 7 views
1

@IBDesignableという単純なUIViewサブクラスがあります。 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

をしました。この方法では、IBで正しく表示されるだけでなく、デバイス上でも正しく表示されるだけでなく、ウィンドウのサイズが変更された場合は、cornerRadiusがそれに応じて調整されます。

1

prepareForInterfaceBuilderあなたはlayoutSubviewsに任意のサイズに関連する調整を移動する必要があります仕事

override func prepareForInterfaceBuilder() { 
    view.clipsToBounds = true 
    view.layer.cornerRadius = bounds.height/2 
} 
関連する問題