Подтвердить что ты не робот

Как установить метку preferredMaxLayoutWidth для автоматического программирования?

Я получаю следующие ошибки при попытке установить ярлык Предпочтительная ширина на Автоматически в раскадровке:

Атрибут недоступен: Автоматическая предпочтительная максимальная ширина макета недоступна в версиях iOS до 8.0

Поскольку мне нужен мой макет для работы с iOS 7 и 8, я планировал сделать следующее:

  • Задайте значение Явно в раскадровке.
  • На iOS 7, установите значение в явную, вычисленную ширину программно.
  • В iOS 8, установите значение в автоматическом режиме.

1 и 2 легко. Как сделать шаг 3? Есть ли константа, которую я могу установить?


Вот что я пробовал до сих пор...

Если вы установите значение в автоматическом режиме на раскадровке, и вы проверите preferredMaxLayoutWidth, вы увидите, что это 0.

Однако попытка установить его на 0, даже если он говорит, что он уже равен 0, не работает должным образом (например, метка остается как одна строка). Например, я попытался установить значение автоматический в раскадровке, а на viewDidLoad я выполнил следующее:

self.label.preferredMaxLayoutWidth = self.label.preferredMaxLayoutWidth;

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


В файле заголовка для UILabel говорится:

// Support for constraint-based layout (auto layout)
// If nonzero, this is used when determining -intrinsicContentSize for multiline labels
@property(nonatomic) CGFloat preferredMaxLayoutWidth NS_AVAILABLE_IOS(6_0);

Что касается константы, я ничего не мог найти. Самая близкая константа, о которой я могу думать, - это UITableViewAutomaticDimension, которая не работает.

Вот что выглядит раскадровка....

Автоматическая ширина макета:

<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="1000" text="Foo" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="Bis-iG-g4l">
    <rect key="frame" x="20" y="116" width="560" height="21"/>
    <fontDescription key="fontDescription" type="system" pointSize="17"/>
    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
    <nil key="highlightedColor"/>
</label>

Явная ширина макета:

<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="1000" text="Foo" lineBreakMode="tailTruncation" numberOfLines="0" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" preferredMaxLayoutWidth="560" translatesAutoresizingMaskIntoConstraints="NO" id="Bis-iG-g4l">
    <rect key="frame" x="20" y="116" width="560" height="21"/>
    <fontDescription key="fontDescription" type="system" pointSize="17"/>
    <color key="textColor" cocoaTouchSystemColor="darkTextColor"/>
    <nil key="highlightedColor"/>
</label>

Единственное отличие состоит в том, что последнее имеет:

preferredMaxLayoutWidth="560"
4b9b3361

Ответ 1

Я не понял способ сделать это программно, но есть довольно приличное обходное решение.

Любое допустимое обходное решение должно отвечать следующим требованиям:

  • Используйте автоматический preferredMaxLayoutWidth на iOS 8 и явным образом на iOS 7.
  • Не должно быть предупреждений.

только способ установить preferredMaxLayoutWidth на автоматически через раскадровку, поэтому мы делаем это.

Чтобы подавить вышеупомянутое предупреждение, установите количество строк в 1.

Теперь, программно, сделайте следующее:

self.label.numberOfLines = 0;
if (iOS8) {
    ; // do nothing, it will use automatic via the storyboard
} else {
    self.label.preferredMaxLayoutWidth = screenWidth - 32;
}

Для справки: как узнать версию iOS, а вот как получить ширину экрана . Обратите внимание, что вы должны специально искать iOS 8, а не то, отвечает ли объект на preferredMaxLayoutWidth, поскольку это свойство было добавлено в iOS 6.