gpt4 book ai didi

iOS 10/11 UICollectionViewFlowLayout 使用 UICollectionViewFlowLayoutAutomaticSize 导致页脚补充 View 未对齐

转载 作者:IT王子 更新时间:2023-10-29 07:59:25 26 4
gpt4 key购买 nike

所以这是一个有趣的问题,我们在 iOS 10 上发现了 UICollectionViewFlowLayout(在 iOS 11 上仍然是一个问题)并且使用 UICollectionViewFlowLayoutAutomaticSize 作为 estimatedItemSize。

我们发现使用 UICollectionViewFlowLayoutAutomaticSize 作为 estimatedItemSize 会导致页脚补充 View float 在底部的几个单元格之上。(红色/粉色是页眉,绿色是页脚。)

UICollectionViewFlowLayoutAutomaticSize problem enter image description here

这是一个示例应用程序的 VC 代码:

import UIKit

class ViewController: UIViewController {

// MARK: Properties

let texts: [String] = [
"This is some text",
"This is some more text",
"This is even more text"
]

// MARK: Outlets

@IBOutlet var collectionView: UICollectionView! {
didSet {
self.collectionView.backgroundColor = .orange
}
}

// MARK: Lifecycle

override func viewDidLoad() {

super.viewDidLoad()

// Layout
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .vertical
if #available(iOS 10.0, *) {
layout.estimatedItemSize = UICollectionViewFlowLayoutAutomaticSize
} else {
layout.estimatedItemSize = CGSize(width: self.collectionView.bounds.width, height: 50)
}
self.collectionView.collectionViewLayout = layout

// Register Cells
self.collectionView.register(UINib(nibName: "TextCell", bundle: nil), forCellWithReuseIdentifier: String(describing: TextCell.self))
self.collectionView.register(UINib(nibName: "SectionHeader", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: String(describing: SectionHeader.self))
self.collectionView.register(UINib(nibName: "SectionFooter", bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: String(describing: SectionFooter.self))

self.collectionView.reloadData()
}
}

// MARK: - UICollectionViewDelegateFlowLayout Methods

extension ViewController: UICollectionViewDelegateFlowLayout {

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize {

return CGSize(width: self.collectionView.bounds.width, height: 90)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize {

return CGSize(width: self.collectionView.bounds.width, height: 90)
}
}

// MARK: - UICollectionViewDataSource Methods

extension ViewController: UICollectionViewDataSource {

public func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {

return self.texts.count
}

func numberOfSections(in collectionView: UICollectionView) -> Int {
return 1
}

public func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {

let cell = collectionView.dequeueReusableCell(withReuseIdentifier: String(describing: TextCell.self), for: indexPath)

if let textCell = cell as? TextCell {

let text = self.texts[indexPath.row]
textCell.configure(text: text)
}

return cell
}

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView {

switch kind {
case UICollectionElementKindSectionHeader:

return collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: String(describing: SectionHeader.self), for: indexPath)

case UICollectionElementKindSectionFooter:

return collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: String(describing: SectionFooter.self), for: indexPath)

default:
return UICollectionReusableView()
}
}
}

// MARK: - UICollectionViewDelegate Methods

extension ViewController: UICollectionViewDelegate {

}

有没有人设法让 UICollectionViewFlowLayoutAutomaticSize 在带有补充页眉和页脚 View 的 iOS 10 上工作?如果我向 estimatedItemSize 添加一个大小,那么它似乎可以工作,但我想知道使用新的 iOS 10 功能时是否存在错误,或者我是否使用不正确。

向 Apple 提交的错误 ID:28843116

更新:这似乎仍然是 10.3 Beta 1 上的一个问题

更新 2:这似乎仍然是 iOS 11 Beta 1 中的一个问题

最佳答案

UICollectionViewFlowLayout 很好地支持单元格的自动布局,但是它不支持补充 View 。每次自动布局代码更新单元格的框架时,它不会对页眉和页脚执行任何操作。所以你需要告诉布局它应该使页眉和页脚无效。有一种方法可以做到这一点!

您应该覆盖 UICollectionViewLayoutfunc invalidationContext(forPreferredLayoutAttributes: UICollectionViewLayoutAttributes, withOriginalAttributes: UICollectionViewLayoutAttributes) 并在其中执行补充 View 失效。

例子:

override open func invalidationContext(forPreferredLayoutAttributes preferred: UICollectionViewLayoutAttributes,
withOriginalAttributes original: UICollectionViewLayoutAttributes)
-> UICollectionViewLayoutInvalidationContext {
let context: UICollectionViewLayoutInvalidationContext = super.invalidationContext(
forPreferredLayoutAttributes: preferred,
withOriginalAttributes: original
)

let indexPath = preferred.indexPath

if indexPath.item == 0 {
context.invalidateSupplementaryElements(ofKind: UICollectionElementKindSectionHeader, at: [indexPath])
}

return context
}

在上面的示例中,如果部分中的第一个单元格无效,我使用 UICollectionViewFlowLayout 提供的无效上下文来使标题补充 View 无效。您也可以将此方法用于页脚失效。

关于iOS 10/11 UICollectionViewFlowLayout 使用 UICollectionViewFlowLayoutAutomaticSize 导致页脚补充 View 未对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40129245/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com