Нежелательное пустое пространство слева от UIScrollView на iPhone X

UIScrollView отлично работает без пробела слева на всех iPad или iPhone, кроме iPhone X. Как удалить пробел?

Я использую раскадровки. Bounce On Scroll/Zoom отключены. На iPad или iPhone нет пробелов, за исключением iPhone X. Я думаю, это может быть связано с безопасной зоной.

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


person zs2020    schedule 22.10.2017    source источник
comment
вы используете раскадровки? вы смотрели на безопасные районы?   -  person Nevin Jethmalani    schedule 23.10.2017
comment
Я использую раскадровку. Bounce On Scroll/Zoom все отключены. На iPad или iPhone нет пробелов, за исключением iPhone X. Я думаю, это может быть что-то, связанное с безопасной зоной…   -  person zs2020    schedule 23.10.2017
comment
Если вы установите ограничение, чтобы пройти мимо безопасной области и до конца суперпредставления, это может сработать, но вы действительно не предоставили достаточно информации, поэтому это может быть много вещей.   -  person Nevin Jethmalani    schedule 23.10.2017
comment
Поделитесь своим кодом и дизайном раскадровки. Поэтому я могу предоставить вам полное решение.   -  person Krunal    schedule 05.11.2017


Ответы (4)


Этот интервал находится в безопасной области, которая применяется слева/справа от UIScrollview как вставки содержимого в альбомной ориентации на iPhone X, что можно увидеть с помощью свойства UIScrollview.safeAreaInsets, доступного только для чтения.

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

UIScrollview.contentInsetAdjustmentBehavior = .never

Значение по умолчанию, равное UIScrollViewContentInsetAdjustmentBehavior.automatic, включает поля направляющей макета безопасной области в качестве вставок содержимого.

Примечание. Ограничения автоматического макета не имеют ничего общего со вставками, это просто поведение настройки вставок содержимого iOS 11 UIScrollview.

person AamirR    schedule 03.02.2018
comment
Мне все равно. Мои изображения в моем прокрутке все еще сжимаются внутри безопасной области и не распространяются на края со всех сторон. - person Jose Ramirez; 22.01.2019

Установка ограничения относительно safeArea является хорошей практикой для iPhone-X. Вот как яблоко говорит -

Когда представление отображается на экране, это руководство отражает ту часть представления, которая не покрыта панелями навигации, панелями вкладок, панелями инструментов и другими представлениями-предками.

В вашем случае вы указываете ограничения leading и trailing из scrollView с safeArea, а не superView

Следовательно, если вы рискнете задать ограничение на superview вместо safeArea, содержимое вашего объекта может быть обрезано, особенно при повороте влево, содержимое слева будет обрезано ниже верхней метки iPhone-X.

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

Документ Apple для safeAreaLayoutGuide

person Jack    schedule 23.10.2017
comment
В iPhone-X, чтобы объект не обрезался из угла, выемка- iOS11+ поставляется с safeArea - person Jack; 08.11.2017
comment
Я забыл выбрать «Использовать руководства по безопасной зоне». Однако я не могу получить ширину поля белых полос слева или справа от безопасной области. - person zs2020; 08.11.2017
comment
@zsong, вы можете посмотреть wwdc2017/204/ для получения дополнительной информации. - person Jack; 08.11.2017
comment
@AamirR см. это для VFL stackoverflow.com/questions/46479288/ - person Jack; 03.02.2018

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

var leftMargin: CGFloat = 0
var rightMargin: CGFloat = 0

if Device.isPhone() && Device.IS_5_8_INCHES() {
    self.leftMargin = 44
    self.rightMargin = 44
}

let frame = CGRect(
    x: (self.view.frame.width - self.leftMargin - self.rightMargin) * CGFloat(pageIndex),
    y: ...
)
person zs2020    schedule 11.02.2018

За это пустое пространство отвечает Макет безопасной области.

1-й вариант.
Игнорировать макет безопасной области для прокрутки и установить ограничения прокрутки в отношении ее суперпредставления (или основного представления). Scrollview автоматически обрабатывает вставку безопасной области для содержимого при прокрутке.

Пейзажный вид:

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

Портретный вид:

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


2-й вариант:
я не рекомендую удалять/изменять макет безопасной области для просмотра прокрутки и альтернативное решение, которое может решить проблему с видимостью пустого пространства:

  • Установите синий цвет фона (который вы применили для представления прокрутки) для основного вида вашего контроллера представления, если представление прокрутки покрывает весь экран.
  • установить четкий цвет фона для просмотра прокрутки

Добавьте этот код в свой viewDidLoad

@ IBOutlet var scrollView: UIScrollView!

override func viewDidLoad(){
    super.viewDidLoad()

    self.view.backgroundColor = UIColor.yellow // set here blue color that you've applied for your scroll view 

    self.scrollView.backgroundColor = UIColor.clear 
}

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

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

person Krunal    schedule 23.10.2017