На какие свойства влияют ограничения?

Я пытаюсь понять логику ограничений и кое-что не могу понять...

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

Вот мой код...

import Foundation
import UIKit

class RoundedButton: UIButton {

    class func make (text:String, color:UIColor) -> RoundedButton {

        let button = self.buttonWithType(UIButtonType.System) as RoundedButton
        button.frame = CGRectMake(0, 0, 150, 40)
        button.layer.cornerRadius = 20
        button.layer.borderColor = color.CGColor
        button.layer.borderWidth = 2

        button.setTitle(text, forState: UIControlState.Normal)
        button.setTitleColor(color, forState: UIControlState.Normal)
        button.titleLabel?.font = UIFont(name: "OpenSans-Semibold", size: 14)
        return button
    }

    func resizeAndPlace(width:CGFloat, height:CGFloat)
    {
        self.setTranslatesAutoresizingMaskIntoConstraints(false)

        let widthCons = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Width, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: width)

        let heightCons = NSLayoutConstraint(item: self, attribute: NSLayoutAttribute.Height, relatedBy: NSLayoutRelation.Equal, toItem: nil, attribute: NSLayoutAttribute.NotAnAttribute, multiplier: 1, constant: height)

        self.superview!.addConstraint(widthCons)
        self.superview!.addConstraint(heightCons)

        println(self.frame.width) // 150 and never changes
    }
}

person Utku Demir    schedule 29.07.2015    source источник
comment
Вам не нужно добавлять ограничения к superview кнопки, так как они влияют только на саму кнопку. self.addConstraint ... будет достаточно.   -  person vacawama    schedule 29.07.2015
comment
Это дает мне Иерархия представлений не подготовлена ​​для ограничения... ошибка, когда я не добавляю ограничения в суперпредставление.   -  person Utku Demir    schedule 29.07.2015
comment
это те же ограничения, которые вы показали выше? Это сработало для меня. Или вы добавляете новые ограничения, например, помещающие кнопку в супервизор?   -  person vacawama    schedule 29.07.2015
comment
Даже проще, чем возиться с добавлением ограничений к представлениям, вы можете просто установить для свойства active значение true. Например, widthCons.active = true.   -  person vacawama    schedule 29.07.2015
comment
актив = истина работал нормально. В чем разница между этими методами?   -  person Utku Demir    schedule 30.07.2015
comment
active = true — это новый способ с IOS 8. Старый способ устарел и исчезнет в будущем. Используйте старый способ для поддержки старых версий iOS. Новый способ проще, потому что iOS сама определяет, к каким представлениям добавлять ограничения. Вы можете легко деактивировать ограничения с помощью active = false. Вы можете активировать массив ограничений, вызвав метод класса NSLayoutConstraint.activateConstraints(c), который удобен для ограничений, созданных с помощью языка визуального формата.   -  person vacawama    schedule 30.07.2015


Ответы (2)


Причина, по которой вы не видите, что ограничения вступают в силу, заключается в том, что макет еще не выполнен. Если вы позвоните:

self.layoutIfNeeded()

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

person vacawama    schedule 29.07.2015

Есть несколько способов сделать это в примере кода. На самом деле вы могли бы сохранить переменные width и height из resizeAndPlace как свойства в вашем классе RoundedButton, но лучшим решением было бы сохранить сами ограничения и выполнить widthConstraint.constant и heightConstraint.constant. Затем, когда вы хотите изменить ограничения, вы можете просто изменить constants вместо удаления старых ограничений и добавления новых ограничений.

person Eric    schedule 29.07.2015