【问题标题】:Unwanted white space on left of UIScrollView on iPhone XiPhone X 上 UIScrollView 左侧不需要的空白
【发布时间】:2018-04-03 11:08:33
【问题描述】:

UIScrollView 在除 iPhone X 之外的所有 iPad 或 iPhone 上没有左侧空白区域时工作正常。如何删除空白区域?

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

【问题讨论】:

  • 您在使用情节提要吗?你看过安全区吗?
  • 我使用故事板。 Bounce On Scroll/Zoom 全部禁用。除了 iPhone X,iPad 或 iPhone 上没有空白。我认为这可能与安全区域有关...
  • 如果您将约束设置为越过安全区域并到达超级视图的末尾,那么它可能会起作用,但您确实没有提供足够的信息,所以可能会有很多事情
  • 分享您的代码和故事板设计。所以我可以为您提供完整的解决方案。

标签: ios uiscrollview background-color iphone-x safearealayoutguide


【解决方案1】:

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

当您不需要时,可以使用以下代码去除安全区域插入:

UIScrollview.contentInsetAdjustmentBehavior = .never

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

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

【讨论】:

  • 对我没有任何影响。我的滚动视图上的图像仍然在安全区域内被挤压,并且不会延伸到所有边的边缘。
  • 为我工作,谢谢!
【解决方案2】:

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

当视图在屏幕上可见时,本指南会反映 未被导航栏、标签栏、工具栏覆盖的视图, 和其他祖先视图。

在您的情况下,您正在给scrollViewsafeArea 的约束leadingtrailing,而不是superView

因此,如果您冒险限制superview 而不是safeArea,您的对象内容可能会被剪切,特别是当您向左旋转时,最左边的内容将剪切到 iPhone-X 的顶部。

Apple doc for safeAreaLayoutGuide

【讨论】:

  • iPhone-X中,为了防止物体从角落被剪掉,notch- iOS11+自带safeArea
  • 我忘记选择“使用安全区域布局指南”。但是我无法获得安全区域左侧或右侧的白条的边距宽度。
  • @zsong,您可以观看wwdc2017/204/以获取更多参考。
  • @AamirR 看到这个 VFL stackoverflow.com/questions/46479288/…
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    Safe Area Layout 负责这个空白。

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

    横向视图:

    纵向视图:


    第二个选项:
    我不建议为您的滚动视图删除/更改安全区域布局以及可以解决空白可见性问题的替代解决方案:

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

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

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

    【讨论】: