Есть ли способ получить все примененные ограничения Auto-layout программно в Swift - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу получить ссылку на все примененные ограничения с использованием раскадровки без каких-либо ссылок:

Я пробовал много способов, но не смог найти точное решение:

Мой подход такойследует:

    if let constraint = (self.constraints.filter{$0.firstAttribute == .height}.first) {

}

, используя вышеуказанный подход, я могу узнать только высоту.

if let topConstraint = (self.constraints.filter{$0.firstAttribute == .top}.first) {
            topConstraint.constant = 150//topMargin
        }
if let leadingConstraint = (self.constraints.filter{$0.firstAttribute == .leading}.first) {
            leadingConstraint.constant = 60 //leadingMargin
        }

Для topConstraint и leadConstraint я получаю ноль.

self.constraints

self.constraints дает только одну ссылку, которая является только высотой, даже если я применил ограничение впереди, сзади и снизу ктот же вид.

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

Я ищу подход, подобный следующему:

 if let topConstraint = (self.constraints.filter{$0.firstAttribute == .top}.first) {
                topConstraint.constant = 150//topMargin
            }
   if let leadingConstraint = (self.constraints.filter{$0.firstAttribute == .leading}.first) {
                leadingConstraint.constant = 60 //leadingMargin
            }
   if let trailingConstraint = (self.constraints.filter{$0.firstAttribute == .trailing}.first) {
                trailingConstraint.constant = 70//leadingMargin
            }
   if let bottomConstraint = (self.constraints.filter{$0.firstAttribute == .bottom}.first) {
                bottomConstraint.constant = 150//49 + bottomMargin
            }

Но, к сожалению, выше один не работает для меня: (

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Со ссылкой на этот ответ

Для вида, подобного UIButton, вы можете найти ограничение top, используя этот код.

extension UIButton {

    func findTopConstraint() -> NSLayoutConstraint? {
        for constraint in (self.superview?.constraints)! {
            if isTopConstraint(constraint: constraint) {
                return constraint
            }
        }
        return nil
    }

    func isTopConstraint(constraint: NSLayoutConstraint) -> Bool {
        return (firstItemMatchesTopConstraint(constraint: constraint) || secondItemMatchesTopConstraint(constraint: constraint))
    }

    func firstItemMatchesTopConstraint(constraint: NSLayoutConstraint) -> Bool {
        return (constraint.firstItem as? UIButton == self && constraint.firstAttribute == .top )
    }

    func secondItemMatchesTopConstraint(constraint: NSLayoutConstraint) -> Bool {
        return (constraint.secondItem as? UIButton  == self && constraint.secondAttribute == .top)
    }
}

Чтобы получитьtop constaint для UIButton, просто используйте этот код

button.findTopConstraint()!

Аналогично вы можете найти любое ограничение для любого представления.

Примечание. Вам необходимо самостоятельно управлять nil делом.

0 голосов
/ 11 сентября 2018

Для одного представления вы можете легко получить все связанные с ним ограничения

for constraint in view.constraints {
   print(constraint.constant)
}

И для всех подпредставлений определенного вида вы можете получить вот так

func getAllTheConstraintConstantsFor(view:UIView) {

   for constraint in view.constraints {
      print(constraint.constant)
   }

   for subview in view.subviews {
      self.getAllTheConstraintConstantsFor(view: subview)
   }
}

Здесь вы можете передать self.view, и вы получите все ограничения.

...