Программирование интерфейса iPhone X без авторазметки

У меня есть старый исходный код приложения, который использует раскадровку и xib без автоматического макета или классов размера. Несмотря на то, что я переписываю его с нуля, это займет некоторое время, так как модулей слишком много. Насущной необходимостью является исправление кода, который вручную устанавливает рамки элементов пользовательского интерфейса, определяя размер экрана во время выполнения. Таким образом, код, написанный таким образом, помещает элементы за пределы безопасной области:

  self.controlBarBkg568h.frame = CGRectMake(0, CGRectGetHeight(self.view.bounds) - tapBarBackgroundImage.size.height, CGRectGetWidth(self.view.bounds), tapBarBackgroundImage.size.height);

Поскольку так много элементов интерфейса расположены таким образом, мне интересно, как можно легко исправить код, который работает на iPhone X?


person Deepak Sharma    schedule 24.10.2017    source источник


Ответы (1)


Используйте свойство safeAreaInsets для UIView. Это объект UIEdgeInsets, описывающий безопасную область для текущего представления. (Документация)

В вашем конкретном случае вы должны иметь возможность изменить свой код на что-то вроде этого:

self.controlBarBkg568h.frame = CGRectMake(0, CGRectGetHeight(self.view.bounds) - tapBarBackgroundImage.size.height - self.view.safeAreaInsets.bottom, CGRectGetWidth(self.view.bounds), tapBarBackgroundImage.size.height);

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

Дополнительная документация по позиционированию контента относительно безопасной области доступна здесь: https://developer.apple.com/documentation/uikit/uiview/positioning_content_relative_to_the_safe_area

person nathangitter    schedule 24.10.2017
comment
Я думаю, что 0 также нужно заменить на self.view.safeAreaInsets.left. - person Deepak Sharma; 24.10.2017
comment
@DeepakSharma Вы правы, но это зависит от вашего варианта использования. Если вы поддерживаете альбомную ориентацию на iPhone X и хотите, чтобы ваши представления учитывали левую и правую безопасные области, вам необходимо учитывать безопасные области. - person nathangitter; 24.10.2017