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

322

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

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

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

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

мононуклеоз
источник
3
Я использую XCode 6.1 и обновил все свои метки до Preferred Width = Explicit. Это решило проблему для меня.
djburdick

Ответы:

373

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

Действия по воспроизведению:

  1. Создать новый однообъективный проект target-c
  2. Установите цель развертывания на 7.1
  3. Откройте раскадровку проекта
  4. Перетащите ярлык на предоставленный контроллер представления
  5. Установите для numberOfLines для этой метки значение 2.
  6. Compile

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

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

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

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

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

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

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

В iOS 8 добавлена ​​поддержка автоматического вычисления предпочитаемого MaxLayoutWidth во время выполнения, что делает создание многострочных меток еще проще. Этот параметр не обратно совместим с iOS 7. Чтобы поддерживать iOS 7 и iOS 8, Xcode 6 позволяет вам выбрать «Автоматический» или «Явный» для предпочитаемый MaxLayoutWidth в Инспекторе размера. Вам следует:

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

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

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

Кроме того, вы можете обойти эту проблему, используя инспектор файлов на раскадровке или xib, о котором идет речь, и измените «Builds for» на «Builds for iOS 8.0 и более поздние версии». Инспектор файлов XCode

memmons
источник
15
Стоит отметить, что вы можете довольно легко случайно ввести это предупреждение, а само предупреждение не помогает найти ярлык, который является виновником. Это неудачно в сложной раскадровке. Вы можете открыть раскадровку как исходный файл и выполнить поиск с помощью регулярного выражения, <label(?!.*preferredMaxLayoutWidth)чтобы найти метки, в которых отсутствует preferredMaxLayoutWidthатрибут / значение. Если вы добавите в preferredMaxLayoutWidth="0"такие строки, это то же самое, что пометить явное и установить значение 0.
Чарльз А.
6
Есть ли какой-либо способ программно настроить UILabel для автоматической настройки предпочитаемой MaxLayoutWidth без фактического создания его подкласса или его реализации где-то в layoutSubviews? Если это поведение, которое IB может включить, это предполагает, что есть свойство или магическое значение, которое можно установить. Но ничто в документах или заголовках API не говорит об этом.
Водоросль
2
@CharlesA. Я проводил тестирование с пустым проектом и обнаружил еще один атрибут метки, который вызовет это предупреждение: если для numberOfLinesнего установлено значение, отличное от 1, предупреждение будет появляться независимо от того, preferredMaxLayoutWidthустановлен он или нет.
меммон
2
@ MichaelG.Emmons Странно, я не могу воспроизвести это с чистым проектом и целью развертывания, установленной на 7.1. Как только я установил preferredMaxLayoutWidthявный 0, предупреждение исчезнет, ​​независимо от numberOfLinesзначения. Но возможно это было исправлено в обновлении XCode этим утром?
Чарльз А.
2
Итак ... единственное решение установить количество строк в 1 и изменить его из кода? это не кажется профессиональным
Jomafer
315

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

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

введите описание изображения здесь

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

введите описание изображения здесь

  1. Далее покажите свою раскадровку как исходный файл. введите описание изображения здесь

  2. Поиск. Вы должны быть в состоянии определить, что это за ярлык, просто посмотрев на содержимое. введите описание изображения здесь

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

введите описание изображения здесь

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

введите описание изображения здесь

smileBot
источник
36
Это должен быть принятый ответ! Это на самом деле решает проблему. Это даже помогает найти другие проблемы в раскадровке, которые обычно не отображаются. Одна вещь: я считаю, что Навигатор отчетов гораздо надежнее, чем щелкнуть правой кнопкой мыши на «Показать в журнале»
Сэм Спенсер
1
Люблю этот ответ, очень просто и исправлю предупреждение. Спасибо!
Итан Паркер
1
Спасибо, оооооооооооо
SR Nayak
2
Почему вы устанавливаете предпочтительную ширину в ноль, а не в ширину, показанную в конструкторе интерфейса?
Biclops
9
Отличный ответ! Вы можете искать идентификатор объекта непосредственно из представления IB Раскадровки. Просто сделайте Ctrl-F. Не нужно открывать его как исходный код, а затем переключаться обратно в представление IB, чтобы изменить предпочтительную ширину.
AndroidDev
36

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

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

  1. Перейдите в Issue Navigator (CMD + 8) и выберите последний, построенный с предупреждением введите описание изображения здесь
  2. Найдите предупреждение (и) (ищите « Автоматический предпочтительный максимальный макет ») и нажмите кнопку расширения справа
    введите описание изображения здесь
  3. Найдите идентификатор объекта UILabel введите описание изображения здесь
  4. Откройте раскадровку и ПОИСК (CMD + f) для объекта. Он будет ВЫБРАТЬ И ОТМЕТИТЬ в UILabel
  5. Установите Preferred Width = 0 «Явный», как предлагали другие
Тибидабо
источник
23

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

Просто включите сборки для iOS 8 и новее

введите описание изображения здесь

Алехандро Луенго
источник
довольно просто и разрушительно. Только 85% пользователей iOS работают на iOS8 + developer.apple.com/support/app-store
aryaxt
6
@aryaxt Мне жаль говорить, что вы не правы. Вы можете установить цель развертывания в настройках проекта на iOS 7 или ниже и изменить Builds для в IB Documents на iOS 8 и новее, и это БУДЕТ работать на iOS 7. Пожалуйста, проверьте его и удалите понижение рейтинга. Вы можете проверить это здесь developer.apple.com/library/ios/recipes/…
Алехандро Луенго
1
Как всегда лучший ответ не принят ... :) Ура!
HepaKKes
ОБНОВЛЕНИЕ для iOS9.3 и выше: устройства iOS7 больше не отображают раскадровки с вышеуказанным параметром. Раньше это работало до обновления 9.3. Похоже, Apple изменила что-то в своем предварительном выпуске автоматизированного процесса.
Печар
4

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

Причина: Вы должны установить линии UILabel> 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;
Ронан
источник
3
«Если вам действительно нужно показать свои слова более чем на 1 строку. Вы должны сделать это в коде». Это тролль, верно?
Webstersx
@webstersx я думаю, что он серьезно
Джаспер
4

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

Линн С
источник
Чувак ты волшебник! Работает даже с UIScrollerView, как и ожидалось. ЛУЧШЕЕ РЕШЕНИЕ до сих пор , потому что я мог оставить свою цель РазВЕРТЫВаНИя в СИБ на iOS7.0
Яро
3

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

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

Джунаид Ахмед
источник
Вы имеете в виду поиск в проекте для идентификатора ярлыка.
Борж
2

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

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

Это где вы должны нажать.

AarneHuttunen
источник
1

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

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

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

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

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

Мэтью Коули
источник
1

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

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

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

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

Gutty1
источник