2017-05-30 3 views
2

ich eine UIView aus einer .xib Datei wie folgt geladen:Frame-Größe von UIView, wenn von Nib geladen?

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

Wenn die Ansicht geladen hat, die genaue Rahmengröße wie in „Frame Rechteck“ der Größe Inspector im Interface Builder gesetzt.

Ist das garantiert? Ich brauche diese Größe, um genau zu sein, weil Subview-Einschränkungen spezifisch sind und nicht passen, wenn die Ansicht die falsche Größe [*] hat, aber ich fand keine Erwähnung in den Apple-Dokumenten.

[*] = Grund: Ich rende die Ansicht zu einem UIImage, damit ich es in und UIImageView später anzeigen kann. Es zeigt das Bild einer Mitgliedskarte und der Name und Mitgliedsnummer müssen auf allen Geräten an der richtigen Stelle mit der richtigen Schriftgröße sein ..

Antwort

1

Erstellen Sie eine benutzerdefinierte Klasse für Ihre 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) 
    } 
} 

und dann nennen, wenn aus der Klasse werden Sie es in mit der Rahmengröße benötigen Sie implementieren oder sonst wird es auf die Standardgröße, die in Ihrem Interface Builder gesetzt:

// 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

Also im Grunde Sie manuell auch den Rahmen gesetzt. Okay, ich denke, es tut nicht weh, den Frame im Code zu setzen, nur um sicherzustellen, dass die xib-Größe nicht garantiert ist. – scrrr

1

Legen Sie eine beliebige UIView Unterklasse als Eigentümer von xib , dann lade Xib als Unteransicht dieser Ansicht und setze Autoresizing Maske. Diese

ist, wie ich es verwenden:

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] Sets Größe Ansicht richtig.

Dann nutzen Sie es einfach jede UIView Unterklasse in der Initialisierung:

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

Danke Vasilii. Ich habe mich nur gefragt, ob der Frame, den ich im Interface Builder gesetzt habe, zur Laufzeit garantiert ist, aber Sie setzen auch xibView.frame explizit, also nehme ich an, dass Sie ihn nicht verwenden oder ihm auch nicht vertrauen. ;) Prost – scrrr

Verwandte Themen