在旋转后获取正确的 readableContentGuide

Getting the correct readableContentGuide after rotation

提问人:MrHaze 提问时间:4/6/2020 最后编辑:MrHaze 更新时间:4/16/2020 访问量:811

问:

我有一个嵌套的 collectionView,我想在旋转后获取它,以便正确设置内容插图。readableContentGuide

这是它的样子:

enter image description here

我已经尝试将集合视图子类化并从 、 和 获取值。layoutMarginsDidChangetraitCollectionDidChangelayoutSubviews

但是,我在那里得到的值始终是前一个值(即当我在纵向时,我得到的是横向值,反之亦然)

我还尝试在 collectionView 的 .collectionView(_:layout:insetForSectionAt:)

目前,似乎唯一有效的解决方案是观察集合视图的边界,但这感觉有点笨拙。

关于如何做到这一点的任何想法?

iOS Swift iPhone Cocoa-Touch UIShationView

评论


答:

2赞 kelin 4/16/2020 #1

如果您在情节提要上使用自动布局,则应激活超级视图的“遵循可读宽度”选项。首先,确保集合视图附加到超级视图的边距。然后转到 superview 并打开 Size Inspector,然后选择以下选项:
Follow Readable Width
感谢 matt 的回答

对于编程自动布局,您不需要边距,只需将集合视图附加到上视图即可。喜欢这个:readableContentGuide

let cv = collectionView

// Guide of the superview
let readableGuide = view.readableContentGuide 

NSLayoutConstraint.activateConstraints([
    cv.topAnchor.constraintEqualToAnchor(readableGuide.topAnchor),
    cv.bottomAnchor.constraintEqualToAnchor(readableGuide.bottomAnchor),
    cv.rightAnchor.constraintEqualToAnchor(readableGuide.rightAnchor),
    cv.leftAnchor.constraintEqualToAnchor(readableGuide.leftAnchor)
])

如果你更喜欢基于框架的编程布局,则不需要使用,也不需要使用,也不需要观察。布局代码的最佳位置是控制器的 func。这将处理任何边界更改,包括接口旋转。layoutMarginsDidChangetraitCollectionDidChangeboundsviewWillLayoutSubviews()

override func viewWillLayoutSubviews() {
    super.viewWillLayoutSubviews()

    collectionView.frame = view.readableContentGuide.layoutFrame

    collectionView.collectionViewLayout.invalidateLayout()
}

这里我解释了为什么我们需要.invalidateLayout()