iPhone X 上 UIScrollView 左侧不需要的白色 space

Unwanted white space on left of UIScrollView on iPhone X

UIScrollView 在所有 iPad 或 iPhone 左侧没有白色 space 的情况下工作正常,除了 iPhone X。我怎么能删除白色 space?

我使用故事板。 Bounce On Scroll/Zoom 全部禁用。除了 iPhone X,iPad 或 iPhone 上没有白色 space。我认为这可能与安全区有关。

相对于 safeArea 设置约束是 iPhone-X 的好习惯。 苹果是这样说的-

When the view is visible onscreen, this guide reflects the portion of the view that is not covered by navigation bars, tab bars, toolbars, and other ancestor views.

在你的情况下,你给出的约束条件是 scrollViewleading & trailingsafeArea,而不是 superView

因此,如果您冒险对 superview 而不是 safeArea 施加约束,您的对象内容可能会被剪裁,特别是当您向左旋转时,最左边的内容将剪裁在 iPhone-X.

Apple doc for safeAreaLayoutGuide

Safe Area Layout负责这个白space.

第一个选项:
忽略滚动视图的安全区域布局并设置滚动视图相对于其超级视图(或主视图)的约束。 Scrollview 在滚动时自动处理内容的安全区域插入。

横向视图:

纵向视图:


第二个选项:
我不建议 remove/change 滚动视图的安全区域布局和可以解决白色 space 可见性问题的替代解决方案:

  • 如果滚动视图覆盖整个屏幕,请将蓝色背景颜色(您已为滚动视图应用的颜色)设置到视图控制器的主视图中 =]
  • 为滚动视图设置清晰的彩色背景

将此代码添加到您的 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 
}

这里有关于安全区域布局的很好的参考答案,以便更好地理解:

此间距来自安全区域,应用于 left/right 的 UIScrollview 作为 iPhone X 横向内容插入,可以使用只读 属性 查看UIScrollview.safeAreaInsets.

当您不需要时,可以使用以下行来摆脱安全区域插入:

UIScrollview.contentInsetAdjustmentBehavior = .never

默认值 UIScrollViewContentInsetAdjustmentBehavior.automatic 包括安全区域布局指南边距作为内容插图。

注意:自动布局约束与 insets 无关,它只是 iOS 11 UIScrollview content insets 调整行为。

好吧,我用非优雅的方式解决了这个问题。但它就像一个魅力。 (我尝试了所有其他答案。感谢您的帮助,但这些答案似乎对我不起作用。)

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: ...
)