2016-07-10 16 views
1

ich eine UIViewController haben, die eine UIScrollView enthält, die dann eine UIImageView. enthält die ich angelegt habe ein UIButton programmatisch (mein Projekt enthält keine Storyboard/nib).Programmatically Einschränkungen für UIButton erstellen

Ich möchte die Schaltfläche in der oberen rechten Ecke des Bildschirms fixiert bleiben, aber ich kann nicht herausfinden, wie Sie manuell die richtige Einschränkung (en) erstellen.

Ich dachte, das folgende würde funktionieren, aber die Schaltfläche ist immer noch nicht richtig positioniert. Muss ich auch etwas in viewWillLayoutSubviews() tun?

// Setup constraints, in viewDidLoad() 
let viewDict = ["shareButton": self.shareButton!] 
self.scrollView.addConstraints(NSLayoutConstraint.constraints(
          withVisualFormat: "H:[shareButton]|", 
             options: [], 
             metrics: nil, 
             views: viewDict)) 

self.scrollView.addConstraints(NSLayoutConstraint.constraints(
          withVisualFormat: "V:|[shareButton]", 
             options: [], 
             metrics: nil, 
             views: viewDict)) 
+0

Ist 'V: | [shareButton]' ein Tippfehler? Es soll 'V: | [shareButton] |' sein. – tktsubota

+0

Was ist das Ergebnis dieses Codes? Wo wird der Knopf sein? Die Schaltfläche ist eine Unteransicht der ViewController-Ansicht oder der scrollView? – ddb

Antwort

0

Wenn Sie alles in Code tun, sind diese beiden Bedingungen nicht vollständig genug, um die Platzierung Ihrer UIImageView angeben, fügen Sie mindestens eine Breite und Gewicht in diesen beiden Einschränkungen (zB die Einschränkungen ändern, wenn Sie bereits haben H:[shareButton(100)]|).

Auch ich empfehle, die Übersetzung der Autoresizemask zu Einschränkungen mit shareButton.translatesAutoresizingMaskIntoConstraints = false zu deaktivieren.

Sie müssen nichts in viewWillLayoutSubviews für dieses Layout tun.

0

Sie diese Erweiterung am Ende Ihrer Klasse hinzufügen können

extension UIView { 


    func addCosntraintsWithFormat(format: String, views: UIView...) { 

     var viewsDictionary = [String: UIView]() 

     for (index, view) in views.enumerate() { 
      let key = "v\(index)" 
      viewsDictionary[key] = view 
     } 

     addConstraints(NSLayoutConstraint.constraintsWithVisualFormat(format, options: NSLayoutFormatOptions(), metrics: nil, views: viewsDictionary)) 
    } 
} 

und dann können Sie Einschränkungen hinzufügen, wie diese

self.scrollView.addConstraintsWithFormat("H:[v0(\(YourWidthConstant))]|", views: shareButton) 
self.scrollView.addConstraintsWithFormat("V:|[v0(\(YourHeightConstant))]", views: shareButton) 

Und die source of this information is this

+0

Die Quelle, die ich hinzugefügt habe enthält relevanten Inhalt um 35:00 Minuten –

1

Sie das nicht erreichen können, Layout, wenn die Bildlaufansicht die oberste Ansicht Ihrer App ist. Eine Einschränkung zwischen einer Bildlaufansicht und einem Nachkomme der Bildlaufansicht beschränkt den Dekandanten immer auf den Bildlaufinhalt der Bildlaufansicht. Weitere Informationen finden Sie unter Technical Note TN2154 UIScrollView And Autolayout. Die Tech-Note wird genau erklärt, was Sie tun müssen:

Beachten Sie, dass Sie ein Subview der Scroll-Ansicht erscheinen lassen können schwimmen (nicht bewegen) über den anderen Scroll-Inhalt von Abhängigkeiten zwischen der Ansicht und einer Ansicht außerhalb der Erstellung den Teilbaum der Bildlaufansicht, z. B. die Superansicht der Bildlaufansicht.

Sie benötigen eine Ansicht Hierarchie so arrangieren:

+-- UIView (view controller's root view) 
    | 
    +-- UIScrollView 
     | 
     +-- UIImageView 
     | 
     +-- UIButton 

oder so:

+-- UIView (view controller's root view) 
    | 
    +-- UIScrollView 
    | | 
    | +-- UIImageView 
    | 
    +-- UIButton 

Dann (entweder mit dieser Regelung) können Sie die Taste, um die Wurzel beschränken können view, like this:

NSLayoutConstraint.activateConstraints([ 
    shareButton.trailingAnchor.constraintEqualToAnchor(view.trailingAnchor, constant:-8), 
    shareButton.topAnchor.constraintEqualToAnchor(view.topAnchor, constant: 8) 
]) 
+1

Dank Rob. Dies ist eine [Kurzfassung] (https://gist.github.com/rmangino/ea99a98d85cbfa1e1eff9d02034cfca8) meiner 'viewDidLoad()' Ich habe keine anderen Einschränkungen hinzugefügt. Siehst du das Problem? TIA – RobertJoseph

+1

Sie müssen 'shareButton einstellen.translateAutoresizingMaskIntoConstraints = false'. –