2016-07-10 3 views
1

У меня есть UIViewController, который содержит UIScrollView, который затем содержит UIImageView. Я создал программный код UIButton (мой проект не содержит раскадровку/ниб).Программно создайте ограничения для UIButton

Я хочу, чтобы кнопка оставалась фиксированной в верхнем правом углу экрана, но я не могу понять, как вручную создать соответствующие ограничения.

Я думал, что следующее будет работать, но кнопка все еще не установлена ​​правильно. Нужно ли мне что-то делать в viewWillLayoutSubviews()?

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

Это 'V: | [shareButton]' опечатка? Предполагается, что это 'V: | [shareButton] |'. – tktsubota

+0

Каков результат этого кода? Где кнопка будет? Кнопка является подзором вида ViewController или scrollView? – ddb

ответ

0

Если вы делаете все, что в коде, эти два ограничения не достаточно, чтобы полностью определить размещение Вашего UIImageView, добавить по крайней мере, ширину и вес в этих двух ограничений (например, изменить ограничения, которые вы уже имеете с H:[shareButton(100)]|).

Кроме того, я рекомендую отключить перевод авторезизмы на ограничения с помощью shareButton.translatesAutoresizingMaskIntoConstraints = false.

Вам не нужно ничего делать в viewWillLayoutSubviews для этого макета.

0

Вы можете добавить это расширение в конце своего класса

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)) 
    } 
} 

, а затем вы можете добавить ограничения как этот

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

И в source of this information is this

+0

Источник, который я добавил, содержит релевантный контент в 35:00 минут –

1

Вы не можете достичь этого если вид прокрутки является видом верхнего уровня вашего приложения. Ограничение между представлением прокрутки и потоком прокрутки всегда ограничивает декандант в прокручиваемом контенте прокрутки. См. Technical Note TN2154 UIScrollView And Autolayout для более подробной информации. Тек записке объясняется именно то, что вам нужно сделать:

Обратите внимание, что вы можете сделать подвид в целях прокрутки появляются плавать (не прокручивать) над другим содержанием прокруткой путем создания ограничений между видом и видом снаружи поддерево просмотра прокрутки, например, представление супервизора прокрутки.

Вы должны организовать иерархию вида, как это:

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

или как это:

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

Тогда (с любой из этих механизмов) вы можете ограничить кнопку в корень вид, например:

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

Спасибо, Роб. Это [сжатая версия] (https://gist.github.com/rmangino/ea99a98d85cbfa1e1eff9d02034cfca8) моего 'viewDidLoad()' Я еще не добавил никаких других ограничений. Вы видите эту проблему? TIA – RobertJoseph

+1

Вам нужно установить 'shareButton.translatesAutoresizingMaskIntoConstraints = false'. –

Смежные вопросы