Несовместимость полей UITableViewCell (Статические ячейки)
У меня есть интересная проблема с несоответствием полей между различными устройствами. Вот 2 скриншота с iPhone X и iPhone 6+ соответственно с одной и той же iOS (11.4.1) и запущенным тем же приложением.
Вы можете видеть, что на iPhone X все выровнено правильно (как и в IB), но на iPhone 6+ есть 4-пиксельное несоответствие.
Это табличное представление со статическими ячейками. Все пункты меню имеют базовый стиль, кроме второго ("Автономный режим"), который выполнен в пользовательском стиле с пользовательскими ограничениями. В базовом стиле UILabels имеют X=16. Мое пользовательское ограничение также имеет постоянное значение 16.
Конечно, я могу изменить свое пользовательское ограничение на 20, но тогда ситуация меняется. Таким образом, на iPhone 6+ все будет правильно выровнено, но на iPhone X будет смещено.
Я попытался выяснить, откуда эти 4 пикселя, но ничего не нашел. Пожалуйста помоги.
3 ответа
Проблема заключается в том, что вы прикрепили передний край вашего ярлыка к краю представления содержимого с константой 16. Это не так, как работают другие ячейки, поэтому вы получите другие результаты.
Вместо этого прикрепите передний край вашей метки к левому полю представления содержимого с константой 0. Левое поле равно 16 на меньшем устройстве и 20 на большем устройстве, что является той разницей, которую вы видите для других. ячейки (потому что именно так они настроены).
Ответ Мэтта правильный. Я просто хочу добавить больше деталей, потому что это может быть полезно для кого-то еще. Итак, оказывается, что все, что мне нужно сделать, это установить следующий флажок в свойствах моего ограничения в IB:
Выглядит довольно просто, когда вы знаете, где искать.
Как правило, как только вы начинаете нуждаться в контроле полей и т. Д. Ячеек табличного представления, лучше всего оставить позади встроенные элементы и создать пользовательские настройки. UITableViewCell
подклассы с явными ограничениями и подпредставлениями.
В этом конкретном случае ширина экрана отличается, и базовый тип ячейки вычисляет ограничения полей относительно ширины экрана. Если вы посмотрите на правую сторону, вы увидите такое же несоответствие с позицией вашего переключателя управления относительно индикатора раскрытия в других ячейках.
(РЕДАКТИРОВАТЬ: простейшее решение, в зависимости от того, к чему вы стремитесь, это, как подсказывает Мэтт, точнее привязать к краю представления контента и к фактическому краю.)
При желании вы можете настроить собственное ограничение для своей пользовательской ячейки, чтобы оно не было постоянным, а относительным. Вы можете выяснить, какой множитель вам понадобится, посмотрев на несколько разных размеров экрана устройства, чтобы увидеть, является ли он постоянным (например, iPhone 6, SE и т. Д.). Но в конечном итоге может оказаться более практичным использование собственных подклассов. Обратите внимание, что вы, как правило, хотите использовать относительные ограничения для подобных вещей, поскольку ваши постоянные поля могут хорошо выглядеть на одном размере экрана, но странно на другом.
Это не идеально, но технически вы также можете проверить, какое устройство использует пользователь (или какова ширина представления) и вернуть соответствующее ограничение, используя переключатель. Хотя, если вас действительно беспокоит только iPhone X против 6+, вы можете подумать об этом.
Вы также можете рассмотреть возможность использования библиотеки форм, такой как Eureka, но есть некоторая кривая обучения с чем-то подобным, особенно когда дело доходит до настройки внешнего вида ячеек и их подпредставлений.