Любой способ отказаться от автоматического изменения размера навсегда? - PullRequest
3 голосов
/ 18 марта 2019

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

view.translatesAutoresizingMaskIntoConstraints

В идеале я бы хотел просто

extension UIView/NSView {
    override var translatesAutoresizingMaskIntoConstraints: Bool = false
}

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

Есть ли какой-нибудь другой простой способ отключить автоматическое изменение размера навсегда?

1 Ответ

1 голос
/ 18 марта 2019

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

extension UIView {
func notTranslated() {
self.translatesAutoresizingMaskIntoConstraints = false
//Add any  additional code. 
    }
}
//Usage
let view = UIView()
view.notTranslated()

Вы не можете override свойства этого ограничения, потому что UIView может быть объявлено в IB

translationsAutoresizingMaskIntoConstraints в соответствии с яблоко .

По умолчанию это свойство имеет значение true для любого представления, которое вы создаете программным способом.Если вы добавляете представления в Интерфейсный Разработчик, система автоматически устанавливает для этого свойства значение false.

представьте, если бы вы могли override это из extension, что привело бы к некоторым конфликтам, если бы были другие UIView имеют противоположное значение True || false, поэтому, по моему мнению:

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

Пожалуйста, если у кого-то есть дополнительная информация, не стесняйтесь вносить.

ОБНОВЛЕНИЕ: я нашел этот крутой ответ, который также может работать, посмотрите код ниже.

class MyNibless: UIView {
    //-----------------------------------------------------------------------------------------------------
    //Constructors, Initializers, and UIView lifecycle
    //-----------------------------------------------------------------------------------------------------
    override init(frame: CGRect) {
        super.init(frame: frame)
        didLoad()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        didLoad()
    }

    convenience init() {
        self.init(frame: CGRect.zero)
    }

    func didLoad() {
        //Place your initialization code here

        //I actually create & place constraints in here, instead of in
        //updateConstraints
    }

    override func layoutSubviews() {
        super.layoutSubviews()

        //Custom manually positioning layout goes here (auto-layout pass has already run first pass)
    }

    override func updateConstraints() {
        super.updateConstraints()

        //Disable this if you are adding constraints manually
        //or you're going to have a 'bad time'
        //self.translatesAutoresizingMaskIntoConstraints = false
        translatesAutoresizingMaskIntoConstraints = false
        //Add custom constraint code here
    }
}
var nibless: UIView = MyNibless()
//Usage
nibless.updateConstraints()
print(nibless.translatesAutoresizingMaskIntoConstraints) //false

Просто создайте MyNibless экземпляр как UIView, и это также откроет большую дверь для настроек

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...