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

Я открыл существующий проект iOS с помощью Xcode6 beta6, а Xcode перечисляет следующее предупреждение для файлов Storyboard и Xib:

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

Я попытался обратиться к предупреждению, установив ширину как явную, как показано ниже:

Однако это не разрешало предупреждения. Как их можно удалить?

Ответ 1

Обновление 3:
Это предупреждение также может быть вызвано ярлыками, для которых numberOfLines установлено значение ничего, кроме 1, если для цели развертывания установлено значение 7.1. Это полностью воспроизводится с помощью нового проекта с одним представлением.

Шаги по воспроизведению:

  • Создайте новый проект с одним представлением, objective-c
  • Задайте цель развертывания 7.1.
  • Откройте раскладку проекта
  • Отметьте метку на представленном контроллере представления.
  • Задайте для numberOfLines для этой метки значение 2.
  • Compile

Я подал следующий радар:
rdar://Проблема/18700567

Обновление 2:
К сожалению, это опять-таки дело в версии Xcode 6. Обратите внимание, что вы можете, по большей части, вручную отредактировать раскадровку /xib, чтобы исправить эту проблему. Per Charles A. в комментариях ниже:

Стоит отметить, что вы можете довольно легко случайно ввести это предупреждение, и само предупреждение не помогает найти ярлык, который является виновником. Это несчастливо в комплексе раскадровки. Вы можете открыть раскадровку в качестве исходного файла и выполнить поиск с регулярным выражением <label(?!.*preferredMaxLayoutWidth), чтобы найти метки, которые опустить предпочтительный атрибут/значение MaxLayoutWidth. Если вы добавите preferredMaxLayoutWidth = "0" на таких строках, это то же самое, что и маркировка явный и установив значение 0.

Обновление 1:
Эта ошибка теперь исправлена ​​в Xcode 6 GM.

Оригинальный ответ
Это ошибка в Xcode6-Beta6 и XCode6-Beta7 и теперь можно смело игнорировать.

Инженер Apple на форумах разработчиков Apple this сказал об ошибке:

Предпочтительная максимальная ширина макета - это свойство автоматического макета на UILabel, которое позволяет автоматически расти вертикально, чтобы соответствовать его содержимому. Версии Xcode до 6.0 устанавливали бы preferredMaxLayoutWidth для многострочные метки до текущего размера границ во время разработки. Ты бы необходимо вручную обновить preferredMaxLayoutWidth во время выполнения, если изменена горизонтальная компоновка.

iOS 8 добавлена ​​поддержка автоматического вычисления preferredMaxLayoutWidth во время выполнения, что делает создание многострочной ярлыки еще проще. Этот параметр не поддерживает обратную совместимость с iOS 7. Для поддержки iOS 7 и iOS 8 Xcode 6 позволяет выбрать либо "Автоматический" , либо "Явный" для preferredMaxLayoutWidth в размере инспектор. Вы должны:

Выберите "Автоматический" , если вы используете iOS 8 для лучшего опыта. Выбирать "Явный", если таргетинг < iOS 8. Затем вы можете ввести значение preferredMaxLayoutWidth, который вы хотите установить. Включение "Явного" по умолчанию используется текущий размер границ при установке флажка.

Предупреждение появится, если (1) вы используете автоматическую компоновку, (2) "Автоматический" установлен для многострочной метки [вы можете проверить это в (см. раздел "Указатель размера для метки" ) и (3) iOS 8.

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

В качестве альтернативы вы можете обойти проблему, используя инспектор файлов в раскадровке или xib в вопросе и измените "Builds for" на "Builds for iOS 8.0 and Later", Xcode file inspector

Ответ 2

Чтобы найти ярлык проблемы в большой раскадровке, выполните следующие действия.

  • В xCode Issue Navigator щелкните правой кнопкой мыши по ошибке и выберите "Reveal In Log". (Примечание: @Sam предлагает ниже, посмотрите в навигаторе xCode. Также @Rivera отмечает в комментариях, что "Начиная с Xcode 6.1.1, щелчок по предупреждению автоматически откроется и выделит противоречивую метку". Я не тестировал это).

enter image description here

  1. Это покажет ошибку с кодом в конце вашего файла раскадровки. Скопируйте значение после .storyboard

enter image description here

  1. Далее, раскройте раскадровку как исходный файл. enter image description here

  2. Поиск. Вы должны быть в состоянии сказать, какой ярлык это отсюда довольно легко, глядя на контент. enter image description here

Как только вы найдете ярлык, решение, которое сработало для меня, заключалось в установке "предпочтительной ширины" на 0.

enter image description here

Кстати, вы всегда можете быстро получить идентификатор элемента интерфейса, выбрав элемент и посмотрев под инспектором идентификации. Очень удобно.

enter image description here

Ответ 3

Вы можете исправить эту проблему , не открывая раскадровку как источник. Это предупреждение запускается UILabels, если numberOfLines!= 1 и целью развертывания является < 8.0

КАК НАЙТИ ЭТО?

  • Перейдите к Навигатору проблем (CMD + 8) и выберите последнюю версию с предупреждением enter image description here
  • Найдите предупреждение (ы) (найдите "Автоматический предпочтительный макс макет" ) и нажмите кнопку расширения справа

    enter image description here
  • Найти идентификатор объекта UILabel enter image description here
  • Откройте раскадровку и ПОИСК (CMD + f) для объекта. Он будет SELECT AND HIGHLIGHT UILabel
  • Установить предпочтительную ширину = 0 "Явно" , как предложили другие

Ответ 4

Решение довольно просто

Просто включите Build для iOS 8 и более поздних версий

enter image description here

Ответ 5

Теперь моя версия Xcode - 6.1. Но я тоже получил это предупреждение. меня это очень раздражает. после поиска снова и снова. Я нашел решение.

Причина: вы должны были установить свои линии UILabel Lines > 1 в своей раскадровке.

Решение: установите для параметра UILabel Lines значение 1 в раскадровке. перезапустите свой Xcode. Это работает для меня, надеюсь, что это может помочь большему количеству людей.

Если вам действительно нужно показывать свои слова более чем на 1 строку. вы должны сделать это в коде.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;

Ответ 6

Подводя итог, для меня, следуя двум приведенным выше инструкциям, чтобы изменить любые экземпляры, где numberOfLines = от 0 до 1 или больше, и вручную добавляя preferredMaxLayoutWidth = "0" к каждому экземпляру метки внутри источника раскадровки, исправлены все мои предупреждения.

Ответ 7

Поскольку у меня нет 50 репутации, Stackoverflow не позволит мне прокомментировать второй лучший ответ. Нашел еще один трюк для поиска метки преступника в Раскадке.

Итак, как только вы узнаете идентификатор ярлыка, откройте свою раскадровку на отдельной вкладке с отображенными диспетчерами и просто выполните команду F и команду V и направьте вас прямо к этой метке:)

Ответ 8

Я получил его, выбрав исходный макет, который у меня был в выборе W/H. Раскадровка работает как ожидалось, и ошибка исчезла.

Также убедитесь, что вы разрабатываете для iOS 8.0. Проверьте это из общих настроек проекта.

Здесь вы должны нажать.

Ответ 9

У меня была эта проблема, и я смог ее исправить, добавив ограничения для определения max для метки.

При отбрасывании многострочной метки в ней нет ограничений, чтобы обеспечить ширину внутри родительского представления. Именно здесь вступает в игру новый PreferredMaxWidth. На iOS 7 и ранее вам нужно определить максимальную ширину самостоятельно. Я просто добавил ограничение 10px в левую и правую сторону метки.

Вы также можете добавить ограничение <= width, которое также устраняет проблему.

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

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

Ответ 10

По какой-то причине даже при изменении целевого уровня развертывания iOS до 8.0 или выше Xib файлы не принимают это изменение и остаются с предыдущими настройками в Инспекторе файлов

Инспектор файлов в Xib после изменения цели развертывания iOS

Следовательно, вы должны изменить его вручную для каждого Xib После ручного изменения

После этого предупреждение исчезнет: -)