Свернуть вид, если он не может соответствовать его собственному размеру в AutoLayout
Я имею UILabel
а также UIButton
внутреннее представление, которое может иметь различный размер, и я хочу, чтобы метка была полностью скрыта, если она не может вписаться в весь контент в текущем кадре, используя только AutoLayout. Так что, в основном, я хочу, чтобы он соответствовал внутреннему размеру, и если он сжимается, он должен сжиматься прямо до нуля без какой-либо средней ширины. Желаемый пример:
Вместо этого я уменьшаю его и пытаюсь отобразить как можно больше:
Можно ли это сделать только с помощью AutoLayout? Если нет, то почему?
Я попытался добавить ограничение нулевой ширины для метки и установить его приоритет меньше сопротивления сжатия метки, но это не работает. Я думал, что как только движок Autolayout нарушит правило внутреннего размера, будет следовать мой нулевой ширины, но, похоже, я что-то упустил.
РЕДАКТИРОВАТЬ: я бы согласился вставить лейбл в некоторых UIView
подкласс, который может проверять внутренние размеры подпредставлений и делать верстку в коде, но я ищу наиболее чистое решение в целом.
2 ответа
Мои текущие решения - встраивать ярлык в заказ UIView
и во время его макета я непосредственно проверяю, стал ли размер меньше внутреннего размера:
@implementation AutocollapsibleView
- (void)layoutSubviews {
UIView *subview = self.subviews.firstObject;
if (self.bounds.size.width < subview.intrinsicContentSize.width) {
subview.frame = CGRectZero;
} else {
[super layoutSubviews];
}
}
@end
К счастью, это работает с IB_DESIGNABLE
Марко, поэтому я сразу вижу результат в Интерфейсном Разработчике
Я знаю, что вы решили свою проблему, но только для того, чтобы немного покрасить автоматическое расположение: у меня было такое же требование "свернуть" представление, которое не соответствует его внутреннему размеру содержимого, и я попробовал ту же технику ограничения нулевой ширины. Проблема с этим методом описана в этой части документации Auto Layout:
После определения необходимых ограничений Auto Layout пытается решить все необязательные ограничения в порядке приоритетов от высшего к низшему. Если он не может найти необязательное ограничение, он пытается приблизиться как можно ближе к желаемому результату, а затем переходит к следующему ограничению.
Очевидно, Auto Layout скорее приблизится к удовлетворению ограничения, чем к ограничению с более низким приоритетом. Это немного странно для меня, потому что, если я хочу, чтобы ширина была >= 100
тогда неясно, что 90 "лучше", чем 80. Тем не менее, я уверен, что если сделать это таким образом, то в большинстве случаев это приведет к более интуитивному поведению.
К сожалению, это делает невозможным использование ограничений с более низким приоритетом в качестве "запасных" ограничений для случаев, когда ограничения с более высоким приоритетом не могут быть выполнены. Я полагаю, что Apple считает, что единственная цель ограничений с более низким приоритетом состоит в том, чтобы сделать макет более конкретным, когда ограничения с более высоким приоритетом приводят к недостаточно ограниченному макету.