如何确定 "z-index of a shadow"

How to determine the "z-index of a shadow"

对不起标题,无法综合不同的问题。这是问题所在:

在我的 UICollectionView 中有一些想要放置阴影的单元格,它们排列得非常靠近彼此,这使得每个单元格的阴影都能到达邻居(第一张图片),而我想要的只是到达背景(第二张图片)。

我的想法或尝试:

  1. 我无法将视图放在单元格后面,向其添加框架,并在此视图中应用阴影,因为单元格具有动态移动(UIDynamics CollectionView 布局)。
  2. 我试过,在 UICollectionViewLayout 的子类中,将所有这些单元格放在同一个 z-index 中。不工作。找出原因:

var zIndex: Int

(...) Items with the same value have an undetermined order.

我需要一些帮助来解决我的问题。谢谢!

您可以尝试将阴影定义为补充视图,与它们各自的单元格对齐,并赋予它们比单元格更低的 z 顺序。

根据 TheEye 的回复,我决定实施 UIDecorationViews。现在一切都很好。

// MARK: At UICollectionViewCustomLayout:

public override init() {
    super.init()
    // Register the NIB of the view that will hold the shadows:
    let nib = UINib(nibName: "Shadow", bundle: nil)
    self.registerNib(nib, forDecorationViewOfKind: "shadow")
}

public override func layoutAttributesForDecorationViewOfKind(elementKind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionViewLayoutAttributes? {
    let layoutAtt: UICollectionViewLayoutAttributes = UICollectionViewLayoutAttributes(forDecorationViewOfKind: "shadow", withIndexPath: indexPath)
    layoutAtt.frame = (layoutAttributesForItemAtIndexPath(indexPath)?.frame)!
    layoutAtt.zIndex = -1
    return layoutAtt
    }

public override func layoutAttributesForElementsInRect(rect: CGRect) -> [UICollectionViewLayoutAttributes]? {
    var atts = [UICollectionViewLayoutAttributes]()
    let numberOfItems:Int = (self.collectionView?.numberOfItemsInSection(0))!
    for index in 0..<numberOfItems {
        let layoutItem = layoutAttributesForItemAtIndexPath(NSIndexPath(forItem: index, inSection: 0))!
        let frameItem = layoutItem.frame
        if CGRectIntersectsRect(frameItem, rect) {
            atts.append(layoutAttributesForDecorationViewOfKind("shadow", atIndexPath: NSIndexPath(forItem: index, inSection: 0))!)
            atts.append(layoutItem)
        }
    }
    return atts
}

// MARK: At the Nib Class File:

// Here I created a additional view to append the shadow. 
// Thats because awakeFromNib() is called before the UICollectionViewCustomLayout 
// have a chance to layout it, but I want to make 
// use of shadowPath to gain performance, thats why 
// I make use of the additional UIView with autolayout stuffs.

@IBOutlet weak var shadowView: UIView!

override func awakeFromNib() {
    super.awakeFromNib()
    shadowView.layer.shadowOffset = CGSizeMake(0, 0)
    shadowView.layer.shadowColor = UIColor.yellowColor().CGColor
    shadowView.layer.shadowRadius = 3
    shadowView.layer.shadowOpacity = 1
    let shadowFrame: CGRect = shadowView.layer.bounds
    let shadowPath: CGPathRef = UIBezierPath(rect: shadowFrame).CGPath
    shadowView.layer.shadowPath = shadowPath
    shadowView.clipsToBounds = false
    self.clipsToBounds = false
}