Xcode 9 - "Ограничения фиксированной ширины могут вызвать обрезку" и другие предупреждения о локализации

Я загрузил новый Xcode и в Interface Builder. У меня много проблем с предупреждениями, которые говорят такие вещи, как:

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

Он выглядит следующим образом:

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

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

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

Ответ 1

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

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

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

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


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

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



Что касается предупреждения в верхней части скриншота:

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

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

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

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

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


Edit

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

Ответ 2

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

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

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

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

Disrespect Language Direction

Ответ 3

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

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

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

Xcode screenshot

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

Xcode screenshot

Ответ 4

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

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

Ответ 5

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

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

enter image description here

Ответ 6

Swift 4, Xcode 9.1:

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

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

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

Ответ 7

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

Ответ 8

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

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

Editor > Embed In > View

В Label я установил Top, Bottom, Leading и Trailing с помощью constant = 0

ограничения

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

Ответ 9

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

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

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

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

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

У меня была аналогичная проблема при попытке кнопки с теми же paddings с краями супер-представления.

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

В результате я использовал ограничение horizontal center и equal widths для super view.

Мое решение

Ответ 13

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

Size Inspector

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

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

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

Contrl + PressClick

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

Leading/Trailing Constraint

Ответ 14

Для UIButton, если вы ХОРОШО по дизайну, чтобы обрезать текст, используйте этот параметр, чтобы отключить предупреждение:

enter image description here