Xcode 9 - «Фиксированные ограничения ширины могут вызвать отсечение» и другие предупреждения локализации

148

Я скачал новый XCode, и в Интерфейсном Разработчике у меня есть куча проблем с предупреждениями, которые говорят вещи как:

Ограничения фиксированной ширины могут вызвать ограничение

Это выглядит так:

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

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

Любые предлагаемые решения?

Дэйв Дж
источник
Я предлагаю вам заняться авторазмером
Dark Innocence
3
Тоже самое. На всех языках есть кнопки шириной 50 пт. Зачем в этом случае использовать мою чистую табель успеваемости?
Джон Скало
9
Это определенно огромная проблема, и удивительно, что об этом больше не говорят: O
Толстяк
2
Я получаю эту ошибку, даже имея только английскую локализацию.
Оттенки
6
Для других, если у вас нет локализаций и вы просто хотите, чтобы эти предупреждения исчезли, переместите раскадровку из папки Base.iproj, как указано здесь: stackoverflow.com/a/45040394/1807644
Уильям Т.

Ответы:

179

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

Здесь происходит несколько разных вещей. Мне удалось отключить предупреждения фиксированной ширины в моем собственном приложении, изменив ширину промежутков между объектами с фиксированной ширины на большую или равную или меньшую или равную .

Это можно сделать, выбрав объект в конструкторе интерфейса, перейдя в инспектор размера и изменив его там:

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


Или выберите ограничение в структуре документа, перейдите в инспектор размера и измените его там:

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



Насколько предупреждение в верхней части вашего скриншота:

Фиксированные начальные и конечные ограничения с центральным ограничением могут вызвать отсечение

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

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

У меня была метка со знаком @, установленная на ведущие и тянущиеся к кнопкам, но также для выравнивания центра с меткой рейтинга . После того как я удалил ограничение выравнивания по центру , предупреждение исчезло, но у меня остался неправильный набор объектов.

Именно тогда я смирился с тем, чтобы принять Stack View . Как бы ни раздражало использование, когда вы правильно поняли все ограничения и настройки, оно выглядит красиво и без предупреждений.


редактировать

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

Оттенки
источник
2
> = 0 предотвращает проблемы перекрытия и исправления, которые у меня были ранее, преобразование Leading / Trailing в Right / Left исправило ошибку отсечения для меня. Результаты могут отличаться. Пожалуйста, проконсультируйтесь с врачом перед началом любой разработки программного обеспечения.
Успение
@ Repose Точно. Подумайте, что может пойти не так, и добавьте ограничение, чтобы убедиться, что это не так.
Оттенки
Отказаться от использования Stack View в iOS, возможно, вполне нормально, но для OS X (извините MacOS) это не всегда хороший выбор. Apple должна это знать. Концепция UI и UX часто имеет разные предположения.
Джоанн
2
Я согласен с принятием UIStackView. Это определенно было болезненно, и я попытался сделать это с парой ограничений, я добавил еще один UIStackView, и он выложился идеально.
templeman15
1
Есть ли другой вариант - Что делать, если я хочу, чтобы мой элемент управления был фиксированной ширины?
Кампай
60

Вы можете попробовать отключить «Respect Language Direction» для каждого ограничения, чтобы отключить предупреждение и посмотреть, поможет ли оно. Выберите ваше ограничение и откройте Атрибуты / Инспектор размера. Пожалуйста, смотрите изображение прилагается.

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

PS Это решение работает для iOS. Для macOS попробуйте> = или <=, чтобы отключить предупреждение.

pps Ярлыки на рисунке ниже гораздо проще создать с помощью свойства AutoLayout и attribuStString для отдельного UILabel или UITextView с использованием NSMutableAttributedString. Изображение только для демонстрации.

Неуважение к языку

Преставление
источник
1
Исправлена ​​проблема «Фиксированные начальные и конечные ограничения с центральным ограничением могут вызывать отсечение» для меня. Спасибо!
toddg
4
Если вы попробовали это, но это не помогло, попробуйте выйти из Xcode и перезапустить его. Этот трюк сработал для меня.
Т`Пол
2
Это не позволит мне отменить это.
Скутер
1
Отлично! это сработало для меня, и нет необходимости менять мои ограничения, спасибо!
rgkobashi
1
> = ограничения имели плохие последствия для меня из-за различных сложных схем приоритетов. Я был готов вставить свою метку в представление, но затем нашел ваше решение, которое помогло! Спасибо :)
KerCodex
33

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

Xcode поможет вам автоматически добавить эти ограничения:

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

Скриншот Xcode

Если у вас есть эта проблема с кнопкой без текста (только изображение), попробуйте удалить «заголовок по умолчанию», который все еще может быть установлен для кнопки:

Скриншот Xcode

паскаль
источник
4
В моем случае удаление заголовка по умолчанию убрало предупреждение. Спасибо!
Рейнхард Маннер
Примите к сведению , что при добавлении UIButtonк Storyboard, то default buttonназвание будет button.
Мигель Тепале
29

С помощью Labelsвы можете установить Linesis 0и Autoshrinkсвойства is Minimum Font Sizeдля удаления Fixed Width Constraints May Cause Clippingпредупреждений, например так:

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

Король Лев
источник
3
Да, вам нужно только установить строки на 0.
Reefwing
2
Установка строки в 0 заставляет метку расширяться до необходимого количества строк, что может быть не тем, что вы хотите.
nickdnk
@nickdnk: я знаю, что если вы установили ограничение высоты для метки, оно не будет расширяться.
Lionking
21

Еще одно быстрое решение!

Для UIButton, изменив заголовок с обычного на атрибутный текст, также решил мою проблему:

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

tryKuldeepTanwar
источник
Работал как шарм!
ремесло
7

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

reojased
источник
4

Swift 4, Xcode 9.1:

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

Если ваши суперпредставления установлены правильно, вы можете попытаться «объяснить» вашему объекту, какова правильная позиция в представлении, установив ограничение «горизонтально в контейнере» :

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

Алессандро Орнано
источник
2

Если вам нужно фиксированное ограничение ширины для кнопки, просто установите приоритет ограничения ширины 700.

ChikabuZ
источник
1

У меня была та же проблема, но при переходе на >=нее автоматически устанавливалась постоянная 0, если я выбираю60 например, , снова появится предупреждение. Так что я был в курсе проблемы.

Я мог бы исправить встраивание моего LabelвView

Editor > Embed In > View

В LabelI наборе Top, Bottom, Leadingи Trailingсconstant = 0

ограничения

В Viewя установил , constraintsчто я ожидал , что раньше.

Гарольдо Гондим
источник
1

У меня была та же проблема при переходе на Xcode 9, и я нашел подход, который полезен для определенных видов макетов. В моем случае я хотел заголовок таблицы, в котором два столбца (UILabels) были фиксированной ширины, а другой - переменной ширины. Независимо от того, как я указывал ширину столбцов (включая использование ограничений больше или равно вместо равных и т. Д.), Я продолжал получать предупреждение о возможном отсечении. В моем случае я хотел, чтобы столбец переменной ширины (UILabel) обрезал при необходимости. Я мог бы просто проигнорировать предупреждение, но мне не нравится это делать.

Подход, который работал здесь, состоял в том, чтобы создать UIView с соответствующими ограничениями размера и внедрить UILabel в качестве подпредставления в UIView. Затем происходит усечение, если это необходимо, и я не получаю предупреждения. Это работает независимо от того, находится ли UIView / встроенная UILabel в StackView или нет.

По сути, это тот же подход, что и у Haroldo Gondim, но здесь вы можете увидеть, что он также работает с или без StackView.

На следующем рисунке показан подход с использованием и без использования StackView. «SpacerName» - это переменная ширина UIView, содержащая метку, а «SpacerPD» - это метка с фиксированной шириной 80. [Цвета не имеют значения; просто чтобы показать, где вид.]

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

Том Линтон
источник
0

Как вы можете видеть на изображении ниже, у меня возникла ошибка «Фиксированные ограничения ширины могут вызвать отсечение», потому что, хотя я установил текстовое поле вертикально по центру, а в метке - ограничение левого поля, я не определил ограничение для текстового поля относительно метки, поэтому XCode предупредил меня, что текстовое поле может обрезать (быть отображено выше) метку.

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

После добавления левого ограничения в текстовое поле, чтобы всегда оставаться на некотором расстоянии от метки, ошибка считалась исправленной XCode, и это больше не беспокоило меня предупреждением об ограничении.

Улисс Алвес
источник
0

У меня была похожая проблема при попытке получить кнопку с такими же отступами от краев супер просмотра.

Случай ошибки

Я закончил тем, что использовал horizontal centerограничение и equal widthsограничение к super view.

Мое решение

Пей
источник
-1

Чтобы исправить ошибку : фиксированные ограничения ширины могут вызвать обрезку »и другую локализацию. Вам необходимо выбрать вид / объект, перейти к« Показать инспектор размера », найти ограничение ширины и установить для константы значение« больше »или« равно »:

Инспектор размера

Чтобы исправить ошибку : отсутствует ограничение Leading / Trailing, что может привести к перекрытию с другими представлениями

Это означает, что Xcode вида / объекта, на который жалуется, пропускает ведущее или конечное ограничение для соседнего представления.

Удерживая элемент управления, перетащите курсор на ближайший вид / объект

Contrl + PressClick

Добавить ведущее или конечное ограничение

Ведущие / конечные ограничения

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