2017-05-30 2 views
2

Je suis en train de charger un UIView d'un fichier .xib comme ceci:Taille de l'image de UIView lorsqu'elle est chargée à partir de Nib?

static func loadFromNib() -> CardView { 
    let nib = UINib(nibName: "CardView", bundle: nil) 
    return nib.instantiate(withOwner: self, options: nil).first as! CardView 
} 

Une fois chargé de la vue a la taille exacte du cadre tel que défini dans « Rectangle Frame » de l'inspecteur de taille dans l'Interface Builder.

Est-ce garanti? J'ai besoin de cette taille pour être exacte, parce que les contraintes subview sont spécifiques et ne correspondront pas si la vue a la mauvaise taille [*], mais je n'ai trouvé aucune mention de cela dans les docs d'Apple.

[*] = Raison: Je rends la vue à un UIImage afin que je puisse l'afficher dans et UIImageView plus tard. Il montre l'image d'une carte de membre et le nom et le nombre de membres doivent être au bon endroit avec la taille de la police correcte sur tous les appareils ..

Répondre

1

Créer une classe personnalisée pour votre UIView:

class CardView: UIView { 

override init(frame: CGrect) { 
    super.init(frame: frame) 
    let xibView = UINib(nibName: "CardView", bundle: nil).instantiate(withOwner: nil, options:nil)[0] as! UIView 
    self.addSubview(xibView) 
    } 

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

et puis appelez si de la classe, vous serez mise en œuvre avec la taille du cadre dont vous avez besoin ou sinon il sera par défaut à la taille définie dans votre interface builder:

// MyViewController 

var cardView: CardView? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.cardView = CardView() 
    self.cardView.frame.size = CGSize(size here) 
    self.cardView.frame.origin = CGPoint(point here) 
    self.view.addSubview(self.cardView!) 

} 
+0

Donc, fondamentalement, vous définissez également le cadre manuellement. D'accord, je suppose que cela ne fait pas de mal de définir le cadre dans le code, juste pour s'assurer que la taille xib n'est pas garantie. – scrrr

1

Définissez la sous-classe UIView en tant que propriétaire de la xérophtalmie , puis charger xib comme sous-vue de cette vue et définir autoresizing masque.

Voilà comment je l'utilise:

extension UIView { 
    func loadXibView(with xibFrame: CGRect) -> UIView { 
     let className = String(describing: type(of: self)) 
     let bundle = Bundle(for: type(of: self)) 
     let nib = UINib(nibName: className, bundle: bundle) 
     guard let xibView = nib.instantiate(withOwner: self, options: nil)[0] as? UIView else { 
      return UIView() 
     } 
     xibView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 
     xibView.frame = xibFrame 
     return xibView 
    } 
} 

xibView.autoresizingMask = [.flexibleWidth, .flexibleHeight] ensembles taille de vue correctement.

Ensuite, il suffit d'utiliser ce toute sous-classe UIView dans l'initialisation:

override init(frame: CGRect) { 
    super.init(frame: frame) 
    addSubview(loadXibView(with: bounds)) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
    addSubview(loadXibView(with: bounds)) 
} 
+0

Merci Vasilii. Je me demandais juste si le cadre que j'ai défini dans Interface Builder est garanti au moment de l'exécution, mais vous avez également défini explicitement xibView.frame, donc je suppose que vous ne l'utilisez pas ou que vous ne lui faites pas confiance non plus. ;) À votre santé – scrrr