2017-11-17 1 views
0

Ich habe ViewController, der so aussieht. Es gibt eine Parent-ScrollView, die UIView (wrapperView) enthält, und diese Wrapper-Ansicht enthält TextView und ImageView. Diese einfache Struktur wird vom Schnittstellen-Generator mit allen Einschränkungen erstellt, die benötigt werden, damit es gut funktioniert.Platzieren von UiView als Unteransicht programmgesteuert

enter image description here

In einigen Fällen muss ich programmatisch in meinem wrapperView direkt unter Image (grüner Pfeil Punkte gibt) eine weitere UIView hinzuzufügen.

Also habe ich xib Datei für meine neue UIView und separate Klasse für sie

class MyView : UIView { 
    class func instanceFromNib() -> UIView { 
     return UINib(nibName: "MyView", bundle: nil).instantiate(withOwner: nil, options: nil)[0] as! UIView 
    } 
} 

Und ich Code meiner Viewcontroller ich

hinzugefügt
let myView = MyView.instanceFromNib() 
myView = CGRect(x: 0, y: 0, width: 300, height: 80) 
wrapperView.addSubview(myView) 

jetzt sehe ich myView auf dem Bildschirm in der Oberseite des wrapperView aber wenn ich versuche, Einschränkungen gelten wie

NSLayoutConstraint(item: myView, attribute: .top, relatedBy: .equal, toItem: myImageView, attribute: .bottom, multiplier: 1.0, constant: 8).isActive = true 

bekam ich

Unable Einschränkungen gleichzeitig erfüllen

Was mache ich falsch?

+1

Haben Sie 'transmittsAutoresizingMaskIntoConstraints' von' myView' auf 'false' gesetzt? – Akki

+1

Sie müssen die 'UIScrollView'-Inhaltsgröße aktualisieren, nachdem Sie eine neue Ansicht hinzugefügt haben. versuchen Sie 'layoutIfNeeded()' aufzurufen. – AaoIi

Antwort

1

Zuerst müssen Sie diese Einstellung vornehmen:

myView.translatesAutoresizingMaskIntoConstraints = false 

Und dann müssen Sie sicherstellen, dass es keine Ihre eigenen Zwänge sind, die miteinander in Konflikt stehen. Im Storyboard haben Sie wahrscheinlich eine Einschränkung hinzugefügt, die imageView.bottomAnchor an wrapperView.bottomAnchor bindet. Wenn Sie nun zwischen diesen beiden Ankern eine andere Ansicht einfügen, müssen Sie diese Einschränkung deaktivieren.

Andernfalls, wenn Sie versuchen, myView dort zu drücken, kann es in Beschränkungskonflikten führen - vorstellen, dass es eine Einschränkung sagen ist, dass

  1. imageView.bottomAnchor 10 Punkte von wrapperView.bottomAnchor sein sollte,

aber es gibt auch zwei weitere Einschränkungen sagen, dass

  1. imageView.bottomAnchor sollte 10 Punkte von 01 seinund myView.bottomAnchor sollten 10 Punkte von wrapperView.bottomAnchor sein.

Offensichtlich können beide diese Szenarien nicht erfüllt werden.

-1

Sie können die Debug-Ansichtshierarchie verwenden, um Ihre UI-Probleme zu debuggen, einschließlich der Einschränkungen, die nicht erfüllt werden. Höchstwahrscheinlich steht Ihre .top-Einschränkung, die zur Laufzeit hinzugefügt wird, in Konflikt mit der .top-Einschränkung, die Sie in Ihrem Storyboard festgelegt haben.

0

Ich denke, dass die einfachste Lösung würde eine UIStackView der wrapperView im Interface Builder ohne Höhe hinzufügen, fügen Sie einfach die erforderlichen Einschränkungen (oben, links, unten, rechts).Dann ziehen Sie eine IBOutlet der UIStackView zu Ihrem Viewcontroller und wenn Sie eine Subview hinzufügen müssen:

@IBOutlet weak var stackView: UIStackView! 

func someFunc() { 
    let myView = MyView.instanceFromNib() 
    myView = CGRect(x: 0, y: 0, width: 300, height: 80) 
    stackView.addArrangedSubview(myView) 
} 

UIStackView wird seine Größe ändern auf der Grundlage seiner Subviews.

Verwandte Themen