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


322

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

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

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

Однак це не вирішило попередження. Як їх можна видалити?


3
Я використовую XCode 6.1 і оновив усі свої мітки до "Привілейована ширина" = "Явна". Це вирішило для мене питання.
djburdick

Відповіді:


373

Оновлення 3:
Це попередження також може бути ініційовано мітками, на яких numberOfLinesвстановлено нічого, крім 1, якщо для вашої цілі розгортання встановлено значення 7.1. Це можна повністю відтворити з новим проектом для перегляду однієї програми.

Кроки до відтворення:

  1. Створіть новий єдиний проект, об'єктивний-c проект
  2. Встановіть ціль розгортання на 7.1
  3. Відкрийте рекламну дошку проекту
  4. Перекиньте мітку на наданий контролер перегляду
  5. Встановіть числоOfLines для цієї мітки на 2.
  6. Складіть

Я подав такий радар:
rdar: // проблема / 18700567

Оновлення 2:
На жаль, це знову ж таки справа у версії Xcode 6. Зверніть увагу, що ви можете, здебільшого, вручну редагувати свою раскадровку / xib, щоб усунути проблему. Перший Чарльз А. в коментарях нижче:

Варто зазначити, що ви можете досить легко випадково ввести це попередження, а саме попередження не допоможе знайти етикетку, яка є винуватцем. Це невдало у складному раскадровці. Ви можете відкрити дошку розкадрування як вихідний файл і здійснити пошук за допомогою регулярного вираження, <label(?!.*preferredMaxLayoutWidth)щоб знайти мітки, які опускають бажаний атрибут / значення MaxMaxLayoutWidth. Якщо в таких рядках додати перевагуMaxLayoutWidth = "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 для iOS 8.0 та пізніших версій" Інспектор файлів Xcode


15
Варто зазначити, що ви можете досить легко випадково ввести це попередження, а саме попередження не допоможе знайти етикетку, яка є винуватцем. Це невдало у складному раскадровці. Ви можете відкрити раскадровку як вихідний файл і здійснити пошук за допомогою регулярного вираження, <label(?!.*preferredMaxLayoutWidth)щоб знайти мітки, які опускають preferredMaxLayoutWidthатрибут / значення. Якщо ви додаєте в preferredMaxLayoutWidth="0"таких рядках, це те саме, що позначати явне значення та встановлювати значення 0.
Чарльз А.

6
Чи є можливість програмно налаштувати UILabel для автоматичного регулювання бажаноїMaxLayoutWidth, фактично не підкласифікуючи його чи реалізуючи його десь у layoutSubviews? Якщо це поведінка, яку IB може активувати, це говорить про наявність властивості або магічного значення, яке можна встановити. Але нічого в документах або заголовках API цього не говорить.
algal

2
@CharlesA. Я тестував порожній проект і знайшов ще один атрибут мітки, який спровокує це попередження: якщо numberOfLinesвстановлено нічого, крім 1, попередження відбудеться незалежно від того, ви preferredMaxLayoutWidthвстановили чи ні.
пам’ятки

2
@ MichaelG.Emmons Дивно, я не можу відтворити це за допомогою чистого проекту та цілі розгортання, встановленого на 7.1. Після встановлення preferredMaxLayoutWidthявного значення 0 попередження відключається незалежно від numberOfLinesзначення. Але, можливо, це було зафіксовано в оновленнях Xcode сьогодні вранці?
Чарльз А.

2
Отже ... це єдине рішення встановити кількість рядків на 1 та змінити його з коду? це не здається професійним
jomafer

315

Щоб знайти ярлики проблем у великій дошці розкадрувань, виконайте мої кроки нижче.

  1. У Навігаторі випусків xCode клацніть правою кнопкою миші на помилку та виберіть "Виявити журнал". (Примітка: @Sam пропонує нижче, дивіться у навігаторі звітів xCode . Також @Rivera в коментарях зазначає, що "Станом на Xcode 6.1.1, натискання на попередження автоматично відкриється та виділить суперечливу мітку". Я цього не перевіряв ).

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

  1. Це покаже помилку з кодом у кінці файлу розкадрівки. Скопіюйте значення після .storyboard

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

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

  2. Пошук. Ви повинні мати можливість сказати, що це за етикетка звідси досить легко, переглянувши вміст. введіть тут опис зображення

Як тільки ви знайдете мітку, рішенням, яке працювало для мене, було встановити "бажану ширину" на 0.

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

До речі, ви завжди можете отримати ідентифікатор елемента інтерфейсу, вибравши елемент і заглянувши під інспектор ідентифікації. Дуже зручно.

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


36
Це має бути прийнята відповідь! Це фактично вирішує проблему. Це навіть допомагає знайти інші проблеми на Дошці розкадрувань, які не відображаються зазвичай. Одне: я вважаю, що Навігатор звітів набагато надійніший, ніж клацання правою кнопкою миші на "Розкрити журнал"
Сем Спенсер

1
Люблю цю відповідь, дуже просту і зафіксував попередження. Дуже дякую!
Етан Паркер

1
Дякую у soooo muchhhhhh :)
SR Nayak

2
Чому ви встановлюєте бажану ширину на нуль, а не на ширину, показану в конструкторі інтерфейсів?
Біклопс

9
Дивовижна відповідь! Ви можете шукати ідентифікатор об'єкта безпосередньо з виду ІВ на Розгортці. Просто зробіть Ctrl-f. Не потрібно відкривати його як вихідний код, а потім доведеться перейти назад до подання IB, щоб змінити бажану ширину.
AndroidDev

36

Виправити цю проблему можна, не відкриваючи розкадровку як джерело . Це попередження спрацьовує UILabels, якщо numberOfLines! = 1 і ціль розгортання <8,0

ЯК ЗНАЙТИ ЇЇ?

  1. Перейдіть до «Навігатор випусків» (CMD + 8) та виберіть останню вбудовану з попередженням введіть тут опис зображення
  2. Знайдіть попередження (ів) (шукайте " Автоматична бажана максимальна компонування ") і натисніть кнопку розширення праворуч
    введіть тут опис зображення
  3. Знайдіть ідентифікатор об'єкта UILabel введіть тут опис зображення
  4. Відкрийте дошку розкадрування та ПОШУК (CMD + f) для об'єкта. Він вибере і висвітлить UILabel
  5. Встановіть бажану ширину = 0 "Явне", як пропонують інші

23

Вирішити це досить просто

Просто увімкніть збірки для iOS 8 та новіших версій

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


досить простий і руйнівний. Лише 85% користувачів iOS перебувають на iOS8 + developer.apple.com/support/app-store
aryaxt

6
@aryaxt Вибачте, що ви помиляєтесь. Ви можете встановити ціль розгортання в налаштуваннях проекту на iOS 7 або новішої версії та змінити збірки для в IB Документах на 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 у Storyboard. перезавантажте свій 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

Підводячи підсумок, дотримуючись двох вищенаведених інструкцій, щоб змінити будь-які випадки, коли числоOfLines = 0 до 1 або більше, і вручну додавати бажанийMaxLayoutWidth = "0" до кожного екземпляра мітки всередині джерела розкадровки виправлено всі мої попередження.


Чувак ти чарівник! Працює навіть із UIScrollerView, як очікувалося. НАЙКРАЩЕ РІШЕННЯ до цих пір, тому що я міг залишити ціль розгортання свого Nib на iOS7.0
Яро

3

Оскільки у мене немає 50 репутації, Stackoverflow не маю права коментувати другу найкращу відповідь. Знайшов ще один трюк для пошуку етикетки винуватця в «Розговоренні».

Отож, коли ви дізнаєтесь ідентифікатор етикетки, відкрийте свою таблицю розкадрів на окремій вкладці з відображеними контролерами перегляду та просто виконайте команду F та команду V і переведе вас прямо до цієї мітки :)


Ви маєте на увазі пошук у проекті ідентифікатора етикетки.
Борж

2

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

Будьте впевнені, що ви розробляєте для iOS 8.0. Перевірте це в загальних налаштуваннях проекту.

Тут слід натиснути.


1

У мене виникла ця проблема, і я зміг її виправити, додавши обмеження для визначення максимуму для мітки.

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

Ви також можете додати обмеження <= width, яке також вирішує проблему.

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

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


1

З якоїсь причини, навіть якщо зміна цілі розгортання iOS на 8.0 або вище, файли Xib не приймають цю зміну і залишаються попередніми налаштуваннями в інспекторі файлів

Інспектор файлів у Xib після зміни цілі розгортання iOS

Тому слід змінити його вручну для кожного Xib Після зміни вручну

Після завершення попередження зникне :-)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.