2017-02-05 1 views
0

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

Это то, что я имею, насколько ограничения идут до сих пор, Строка «Развлечения» представлена ​​categoryLabel и «Disney: build it frozen» от nameLabel.

enter image description here

addConstraints(withFormat: "H:|-8-[v0(90)]-8-[v1]-8-|", views: imageView, nameLabel) 
addConstraints(withFormat: "V:|-8-[v0(90)]", views: imageView) 

addConstraints(withFormat: "H:[v0]-8-[v1]", views: imageView, nameLabel) 
addConstraints(withFormat: "V:|-8-[v0]-8-[v1]", views: nameLabel, categoryLabel) 

func addConstraints(withFormat format: String, views: UIView...) { 
    var viewsDictionary = [String: UIView]() 
    for (index, view) in views.enumerated() { 
     let key = "v\(index)" 
     view.translatesAutoresizingMaskIntoConstraints = false 
     viewsDictionary[key] = view 
    } 

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

Проблемы я имею, как добавить «categorylabel» с ограничениями, таким образом, чтобы оно располагались в правую части ImageView на 8 пикселей и непосредственно под nameLabel на 8 пикселей. Как вы можете видеть на скриншоте, я могу добиться его размещения под именемLabel, но мне трудно сделать так, чтобы «categorylabel» также находилась справа от изображения.

Любые советы будут очень высоко ценится :)

То, что я хочу, чтобы это выглядело как enter image description here

+0

Есть ли причина, по которой вы это программируете? Возможно, вам будет проще прояснить это, используя 'UIStackView'. https://www.raywenderlich.com/114552/uistackview-tutorial-introducing-stack-views. Он доступен от iOS 9 и более поздних версий. – Adrian

+0

Спасибо за головы, но так же просто, как эта задача будет делать это через раскадровки, но я пытаюсь добиться этого программным путем. –

+0

Не могли бы вы представить картину того, как ее искать? – matt

ответ

1

К сожалению, обернув NSLayoutConstraint.constraints в своей собственной функции, вы предотвратили доступ к этой функции вам нужно, что заключается в том, чтобы указать .alignAllLeadingNSLayoutFormatOptions на ваше ограничение категории nameLabel.

По сути, что вам нужно:

NSLayoutConstraint.constraints(withVisualFormat: "V:|-8-[v0]-8-[v1]", options: .alignAllLeading, metrics: nil, views: viewsDictionary)) 

Это скажет autolayout, что вы хотите, чтобы передние кромки двух элементов, которые будут выровнены и разделены по вертикали 8. Так как вы уже ваше имя поле позиционированы относительно к краю изображения, это поместит ваше поле категории, где вы хотите.

Вы можете повторно фактор вашей функцию принять NSLayoutFormatOptions:

func addConstraints(withFormat format: String, options: NSLayoutFormatOptions = NSLayoutFormatOptions(), views: UIView...) { 

var viewsDictionary = [String: UIView]() 
    for (index, view) in views.enumerated() { 
     let key = "v\(index)" 
     view.translatesAutoresizingMaskIntoConstraints = false 
     viewsDictionary[key] = view 
    } 

    addConstraints(NSLayoutConstraint.constraints(withVisualFormat: format, options: options, metrics: nil, views: viewsDictionary)) 
} 

, а затем вызвать его:

addConstraints(withFormat: "V:|-8-[v0]-8-[v1]", options: .alignAllLeading, views: nameLabel, categoryLabel) 

Кстати, вам не нужно использовать раскадровки использовать стек Просмотры.

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