如何设置collection view条目alpha为0.5但header alpha为1.0
问题解答
完全可以实现,注意不要直接给UICollectionView整体设置alpha——父视图的alpha属性会被所有子视图继承,直接改容器透明度会导致cell和header一起变透明,达不到分层效果。
实现方案
- 方案1:在代理方法中单独配置
实现UICollectionViewDataSource的collectionView(_:cellForItemAt:)方法,对每一个加载出来的cell单独设置透明度:
header视图的配置在func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "YourCellID", for: indexPath) cell.alpha = 0.5 // 其余cell配置逻辑 return cell }collectionView(_:viewForSupplementaryElementOfKind:at:)方法里完成,直接给header设置alpha = 1.0即可,和cell的透明度互不影响。 - 方案2:通过自定义布局统一配置
如果不想在代理方法里零散配置透明度,可以自定义UICollectionViewFlowLayout子类,重写layoutAttributesForElements(in:)方法,统一区分元素类型设置属性:override func layoutAttributesForElements(in rect: CGRect) -> [UICollectionViewLayoutAttributes]? { guard let attributesList = super.layoutAttributesForElements(in: rect) else { return nil } attributesList.forEach { attr in switch attr.representedElementCategory { case .cell: attr.alpha = 0.5 case .supplementaryView: // 判断是header类型就设置不透明 if attr.representedElementKind == UICollectionView.elementKindSectionHeader { attr.alpha = 1.0 } default: break } } return attributesList }
注意:如果后续需要动态调整透明度(比如滚动时做渐变效果),可以遍历
collectionView.visibleCells给所有可见cell改alpha,再单独拿到可见的header视图设置alpha即可,不会出现透明度互相影响的问题。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

