UICollectionView 滚动时顶部出现异常栏该如何解决?
问题描述
- 启动App时一切正常,界面显示符合预期:正常显示效果
- 向下滚动UICollectionView时,顶部会出现异常栏:滚动后出现的顶部异常栏
- 已排查frame相关问题未找到原因,UICollectionView为纯代码实现,相关代码如下:
import UIKit // MARK: 数据结构体的创建与填充 struct Profile { let name: String let location: String let imageName: String let profession: String } var profiles: [Profile] = [] private func populateProfiles() { profiles = [ Profile(name: "Thor", location: "Boston", imageName: "astronomy", profession: "astronomy"), ... Profile(name: "Elon Musk", location: "San Francisco", imageName: "graduate", profession: "graduate") ] } class ViewController: UIViewController { private let collectionView: UICollectionView = { let viewLayout = UICollectionViewFlowLayout() let collectionView = UICollectionView(frame: .zero, collectionViewLayout: viewLayout) // collectionView.backgroundColor = .white return collectionView }() // MARK: 创建背景图 let imageView : UIImageView = { let iv = UIImageView() iv.image = UIImage(named:"Backround-wood") iv.contentMode = .scaleAspectFill return iv }() private enum LayoutConstant { static let spacing: CGFloat = 50.0 // 元素间距大小 static let itemHeight: CGFloat = 500.0 // 单元格高度 } override func viewDidLoad() { super.viewDidLoad() setupViews() setupLayouts() populateProfiles() // 完成结构体数据填充 collectionView.reloadData() self.collectionView.backgroundView = imageView // 插入背景图 } // MARK: 旋转 - 单元格重设大小与转场 override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) { super.viewWillTransition(to: size, with: coordinator) coordinator.animate( alongsideTransition: { _ in self.collectionView.collectionViewLayout.invalidateLayout() }, completion: { _ in } ) } private func setupViews() { view.backgroundColor = .white view.addSubview(collectionView) collectionView.dataSource = self collectionView.delegate = self collectionView.register(ProfileCell.self, forCellWithReuseIdentifier: ProfileCell.identifier) collectionView.contentInsetAdjustmentBehavior = .never // 单元格从更靠上的位置开始布局 } // MARK: collectionView约束设置 private func setupLayouts() { collectionView.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ collectionView.topAnchor.constraint(equalTo: view.topAnchor), //view.safeAreaLayoutGuide.topAnchor), collectionView.bottomAnchor.constraint(equalTo: view.bottomAnchor), //view.safeAreaLayoutGuide.bottomAnchor), collectionView.leftAnchor.constraint(equalTo: view.leftAnchor), collectionView.rightAnchor.constraint(equalTo: view.rightAnchor) ]) } init() { super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } } extension ViewController: UICollectionViewDataSource { func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return profiles.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: ProfileCell.identifier, for: indexPath) as! ProfileCell let profile = profiles[indexPath.row] cell.setup(with: profile) cell.contentView.backgroundColor = .red return cell } } extension ViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let width = itemWidth(for: view.frame.width, spacing: LayoutConstant.spacing) return CGSize(width: width, height: LayoutConstant.itemHeight) } func itemWidth(for width: CGFloat, spacing: CGFloat) -> CGFloat { let itemsInRow: CGFloat = 2 let totalSpacing: CGFloat = 2 * spacing + (itemsInRow - 1) * spacing let finalWidth = (width - totalSpacing) / itemsInRow return floor(finalWidth) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: LayoutConstant.spacing, left: LayoutConstant.spacing, bottom: LayoutConstant.spacing, right: LayoutConstant.spacing) } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat { return LayoutConstant.spacing } func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { return LayoutConstant.spacing } }
请问有开发者可以帮忙定位并解决这个问题吗?
内容的提问来源于stack exchange,提问作者Vollhardt
相关产品推荐
相关产品推荐

