2017-07-29 2 views
1

J'ai une simple sous-classe UIView que j'ai créée @IBDesignable. J'ai surchargé init frame et init coder. Mon code charge la description de la vue à partir d'un fichier .xib. Une fois le fichier .xib a été chargé, j'essaie de définir:view.frame n'est pas défini lorsque IBDesignable charge xib

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

pour obtenir un « rectangle avec des côtés circulaires ».

Le problème est que frame.size.height = 0 à ce moment-là (après .xib est chargé et mon affichage personnalisé dessiné pour la première fois par Interface Builder).

Y a-t-il une solution de contournement?

Ici, il est mon code:

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

Merci, Luca-

Répondre

2

Vous devez déplacer les ajustements liés à la taille dans layoutSubviews. De cette façon, non seulement il sera rendu correctement dans IB, mais aussi sur l'appareil, si la taille de la fenêtre change, le cornerRadius sera ajusté en conséquence.

1

prepareForInterfaceBuilder a fait le travail

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