如何在UICollectionView下隐藏Refresh Control(XCode9+Swift4)
嘿,这个UICollectionView和UIRefreshControl的层级坑我之前踩过!给你几个实用的解决方案,完美解决覆盖/透间隙的问题:
解决方案1:使用UICollectionView官方推荐的refreshControl属性(优先推荐)
从iOS 10开始,UICollectionView和UITableView一样,直接提供了refreshControl属性,系统会自动帮你处理好层级和布局逻辑,完全不会出现你遇到的覆盖或透间隙问题。代码很简单:
// 在viewDidLoad里初始化并赋值 override func viewDidLoad() { super.viewDidLoad() let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: #selector(handleRefresh(_:)), for: .valueChanged) // 直接赋值给collectionView的refreshControl属性,而不是addSubview collectionView.refreshControl = refreshControl } @objc private func handleRefresh(_ sender: UIRefreshControl) { // 你的刷新逻辑 DispatchQueue.main.asyncAfter(deadline: .now() + 1) { sender.endRefreshing() } }
这个方法和UITableView的实现逻辑完全一致,是最省心的方案,刚好你用的Xcode 9对应的iOS SDK支持这个属性,放心用就好。
解决方案2:将Refresh Control添加到CollectionView的背景视图
如果因为某些原因不能用上面的属性,可以把Refresh Control加到collectionView的backgroundView上,这样它会默认在所有单元格的后方,下拉时随内容滚动显示,滚回顶部后被单元格完全遮挡,不会出现覆盖或透间隙的情况:
override func viewDidLoad() { super.viewDidLoad() let refreshControl = UIRefreshControl() refreshControl.addTarget(self, action: #selector(handleRefresh(_:)), for: .valueChanged) // 处理backgroundView if let bgView = collectionView.backgroundView { bgView.addSubview(refreshControl) } else { let bgView = UIView(frame: collectionView.bounds) bgView.addSubview(refreshControl) collectionView.backgroundView = bgView } // 添加约束让Refresh Control在顶部居中 refreshControl.translatesAutoresizingMaskIntoConstraints = false NSLayoutConstraint.activate([ refreshControl.topAnchor.constraint(equalTo: collectionView.topAnchor), refreshControl.centerXAnchor.constraint(equalTo: collectionView.centerXAnchor) ]) }
临时治标方案:确保单元格背景不透明
如果你暂时不想改添加方式,之前设置refreshControl.layer.zPosition = -1导致透间隙的话,可以给所有UICollectionViewCell设置不透明的背景色(比如cell.backgroundColor = .white),这样单元格之间的间隙就不会透出后面的Refresh Control了。不过这个只是临时解决,还是推荐前两种方案更彻底。
内容的提问来源于stack exchange,提问作者Yury
相关产品推荐
相关产品推荐

