Дополнительные ограничения регистрируются, когда я NSLog myBtn.constraints

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

Правое место для наблюдения = 10

верхнее пространство для супервизора = 10

нижнее пространство для наблюдения >= 10

слева пробел до метки >= 10

Все работает нормально, и у меня нет проблем с моим макетом. Но когда я регистрирую ограничения кнопок с помощью этого кода:

NSLog(@"constraints for btnBack is: %@", self.btnBack.constraints);

логи консоли:

constraints for btnBack is:(

"<NSContentSizeLayoutConstraint:0x7c35c400 H:[UIButton:0x7c3588a0(102)] Hug:250 CompressionResistance:750>"

"<NSContentSizeLayoutConstraint:0x7c35c450 V:[UIButton:0x7c3588a0(92)] Hug:250 CompressionResistance:750>")

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

Почему ограничения высоты и ширины регистрируются в консоли?


person amin akbarzade    schedule 17.04.2016    source источник


Ответы (2)


Если представление имеет естественную ширину, основанную на его содержимом, оно возвращает эту ширину как intrinsicContentSize.width. В противном случае он устанавливает intrinsicContentSize.width в UIViewNoIntrinsicMetric.

Точно так же, если он имеет естественную высоту, он возвращает эту ширину как intrinsicContentSize.height. В противном случае он устанавливает intrinsicContentSize.height в UIViewNoIntrinsicMetric.

Кнопка имеет естественный размер (и ширину, и высоту), определяемый ее заголовком, шрифтом, изображением и, возможно, другими деталями. Таким образом, его intrinsicContentSize.width и intrinsicContentSize.height являются допустимыми размерами, а не UIViewNoIntrinsicMetric.

Когда intrinsicContentSize.width != UIViewNoIntrinsicMetric, автоматическая компоновка устанавливает специальное ограничение типа NSContentSizeLayoutConstraint на вид. Точно так же, когда intrinsicContentSize.height != UIViewNoIntrinsicMetric, автоматический макет устанавливает NSContentSizeLayoutConstraint в представлении.

Подробнее о том, что делают эти специальные ограничения, см. в этом ответе.

person rob mayoff    schedule 17.04.2016
comment
То есть вы имеете в виду, что они похожи на настоящие ограничения? Я увеличил ширину этикетки, а затем увидел, что кнопка уменьшилась. (потому что я не добавил ширину ограничения к моей кнопке). Если я добавлю ширину ограничения к моей кнопке (в построителе интерфейса), моя кнопка не сжимается. - person amin akbarzade; 18.04.2016
comment
Да, это настоящие ограничения, но по умолчанию они имеют приоритет меньше, чем Required (1000). Когда вы добавляете ограничение ширины, оно по умолчанию имеет приоритет «Обязательно» (1000), поэтому оно выигрывает. - person rob mayoff; 18.04.2016

Если view.translatesAutoresizingMaskIntoConstraints равно FALSE, то UIKit может добавить NSContentSizeLayoutConstraint к представлению. В этом случае автоматический макет использует -sizeThatFits: или intrinsicContentSize для вычисления размера представления.

Если у вас есть представление, которое вы перемещаете из одного суперпредставления в другое, обязательно сбросьте view.translatesAutoresizingMaskIntoConstraints. Если в новом суперпредставлении используется автоматический макет, установите translatesAutoresizingMaskIntoConstraints в FALSE. Если новый суперпредставление не использует автомакет, установите значение TRUE. Если вам не удастся сбросить translatesAutoresizingMaskIntoConstraints, вы можете увидеть неожиданную анимацию кадров.

person Carlos Salinas    schedule 14.05.2021