2017-06-15 5 views
0

ich wiederverwendbar Ansichten in einer xib/nib Datei in schnellen iOS 10.Ist das Verhalten von StackView Constraints in einer NIB/XIB anders?

Wenn ich eine Stapelansicht und haben 2 Objekte darin und stellen Sie sicher, dass meine stackview gezwungen ist, auf den Behälter Ansicht der erstellen bin versucht, nib/xib (von oben nach unten, von unten nach rechts, führend und schließlich nachlaufend), erhalte ich die Fehlermeldung, dass meine Y-Position für das erste und das zweite Objekt fehlt. Wenn Sie nur eine von ihnen erstellen, wird dies normalerweise behoben. Obwohl dies ist, wo Dinge seitwärts gehen. Bei all meinen bisherigen Recherchen sollte ich das nicht tun müssen, wenn ich meine Stackview auf Fill verteilt habe. Obwohl dies Xcode zu beruhigen scheint, erzeugt es ein Problem mit übermäßigen Einschränkungen, wenn ich versuche, mein Programm auszuführen.

Hier ist, was ich verwenden, um meine Feder in einer Ansicht von meiner Haupt-Storyboard zu laden:

public protocol NibOwnerLoadable: class { 
    static var nib: UINib { get } 
} 

//MARK:- Generic Implementation 
public extension NibOwnerLoadable { 
    // Use the xib file with the same name as your UIView subclass located in the bundle of that class 
    static var nib: UINib { 
     return UINib(nibName: String(describing: self), bundle: Bundle(for: self)) 
    } 
} 

//MARK:- Support for instation from the XIB file 
public extension NibOwnerLoadable where Self: UIView { 
    // Function to load content and constraints automatically 
    func loadNibContent() { 
     let layoutAttributes: [NSLayoutAttribute] = [.top, .leading, .bottom, .trailing] 
     for view in Self.nib.instantiate(withOwner: self, options: nil) { 
      if let view = view as? UIView { 
       view.translatesAutoresizingMaskIntoConstraints = false 
       view.frame = bounds 
       self.addSubview(view) 
       layoutAttributes.forEach{ attribute in self.addConstraint(NSLayoutConstraint(item: view, attribute: attribute, relatedBy: .equal, toItem: self, attribute: attribute, multiplier: 1, constant: 0.0)) 
       } 
      } 
     } 
    } 
} 

Ich weiß, dass mein Problem ist eine zusätzliche Beschränkung, das durch Auto-Layout hinzugefügt wird, aber warum und wo. Diese andere Frage ist sehr nah an dem, was ich versuche zu tun, aber aus irgendeinem Grund ist mein AutoLayout-Wissen in meinem Kopf durcheinander. Adding a subclassed UIView to a Nib with its auto layout constraints Ein wenig Hilfe wäre zu schätzen. Bitte erläutern Sie den Grund, nicht nur, wie es geht. Ich bin ein Typ, der gerne die Hintergrundgeschichte versteht. Es macht es logisch und leichter zu behalten.

Hier sind Bilder meiner filterView als Nib/Xib, die in SearchAndFilterView als FilterView (UIView) geladen wird, die in einem meiner View Controller in meinem Storyboard geladen wird. Denken Sie an wiederverwendbare Tool-Ansichten.

Storyboard ViewController

FilterView XIB

SearchAndFilterView XIB

+0

Lassen Sie mich ein wenig mehr klären ... –

+0

Lassen Sie zuerst sehen, ob ich diese Aufgabe zuerst erledigen kann. Ich möchte, dass meine Containeransichten für meine XIB/NIB-Ansicht eine bestimmte Höhe haben. Diese XIB/NIB-Ansichten müssen eine bestimmte Größe haben und sich in einer Stapelansicht befinden, damit ich die Ansicht verkleinern kann, wenn diese Containeransicht ausgeblendet wird. Ich kann dies tun, ohne XIB/NIB in Ordnung, aber ich kann dies nicht erreichen, Container-Ansichten subclassed meines XIB/NIB fileOwner verwendend. –

Antwort

0

Woohou!

Hier ist, wie ich das herausgefunden habe.

Ich erkannte, dass meine Höhenbeschränkungen für meine Ansichten mit XIB/NIB notwendig sind, um die Ansicht einzurichten, wenn sie nicht ausgeblendet ist. Aber wenn ich den .isHidden auf True-Wert setze, würde dies mit meiner Höhenbeschränkung kollidieren.

Ich musste Autolayout sein automatisches Layout machen lassen, wenn die Ansicht von versteckt zu nicht versteckt geändert wurde und umgekehrt. Indem ich eine Beschränkung mit einem Prioritätsstandardwert von 1000 einstellte, sagte ich zu Autlayout, um absolut sicherzustellen, dass diese Einschränkung immer aktiv ist.

Ich erkannte, dass durch Festlegen der Priorität auf 999, ich Autolayout sagte, könnte es meine Einschränkung überschreiben, wenn es wirklich benötigt wurde, es zu tun. Warum 999, ich nehme an, dass wenn eine Ansicht ausgeblendet ist, hat sie wirklich keine Größe und das ist sehr hohe Priorität für Autolayout.

Ich wünschte, ich wüsste dies oder wusste, wie man Standardautomatik Prioritäten vor zu finden.

Wenn jemand mehr darüber weiß, würde ich mich über weitere Informationen oder einen Link freuen !!!

Verwandte Themen