0

我已经继承MaterialView并覆盖drawRect了一个自定义视图,然后我将其添加为我的 tableViewFooter。正如标题所说,我无法深入工作。我已经在不同的层/视图上搞砸了clipsToBounds,但没有成功。masksToBounds它是 UIViewController 内部的一个 tableView ,只是为了让我的代码更清晰。

    let receiptEdge = ReceiptEdge(frame: CGRect(x: 0, y: 0, width: self.view.w, height: 30))
    receiptEdge.backgroundColor = .whiteColor()
    receiptEdge.depth = MaterialDepth.Depth5

    //What I've tried messing with for an hour
    receiptEdge.clipsToBounds = false
    receiptEdge.layer.masksToBounds = true
    self.tableView.clipsToBounds = false
    self.view.clipsToBounds = false
    self.view.layer.masksToBounds = true
    self.tableView.layer.masksToBounds = true

    self.tableView.tableFooterView = receiptEdge

我的子类代码ReceiptEdge

    override func prepareView() {
    super.prepareView()

    let rect = self.frame
    let path = UIBezierPath()
    let receiptEdgeSize = CGFloat(rect.width / 75)
    var x = CGFloat(-receiptEdgeSize / 2)
    let y = rect.size.height / 2
    path.moveToPoint(CGPoint(x: x, y: y))

    while x < rect.width {
        x += receiptEdgeSize
        path.addLineToPoint(CGPoint(x: x, y: y))
        x += receiptEdgeSize
        path.addArcWithCenter(CGPoint(x: x, y: y), radius: receiptEdgeSize, startAngle: CGFloat(M_PI), endAngle: CGFloat(0), clockwise: true)
        x += receiptEdgeSize
    }

    path.addLineToPoint(CGPoint(x: x, y: CGFloat(0)))
    path.addLineToPoint(CGPoint(x: 0, y: 0))
    path.addLineToPoint(CGPoint(x: 0, y: y))

    let layer = CAShapeLayer()
    layer.path = path.CGPath

    self.layer.mask = layer
    self.visualLayer.mask = layer
    self.visualLayer.backgroundColor = UIColor.blueColor().CGColor

    self.layer.shadowColor = UIColor.redColor().CGColor
}

没有显示深度的屏幕截图

没有显示深度

提前感谢比我更了解图层的人!这是一个视图示例,我在其中深入研究了MaterialTableViewCellusing的子类MaterialDepth.Depth2

在此处输入图像描述

这是layer具有相同路径的visualLayer 在此处输入图像描述

在这里,我没有设置任何图层或路径self.layer。有阴影,但视图或阴影没有剪裁到可视层。将 shadowColor 设置为红色,以便您可以看到差异。

在此处输入图像描述

4

1 回答 1

0

所以深度的工作方式。

MaterialView 是一个复合对象,它使用两个层来实现其裁剪边界并仍然提供阴影的能力。调用的 CAShapLayervisualLayer作为子层添加到视图的支持层。所以添加图片时,实际上是添加到了visualLayer,它的masksToBounds属性设置为true,而layer属性的maskToBounds属性设置为false。这允许在属性上显示深度属性,layer并且仍然给人一种剪裁的感觉。

在这一行

receiptEdge.layer.masksToBounds = true

你实际上是在剪裁深度。所以我会尝试做的是设置这个

let layer = CAShapeLayer()
    layer.path = path.CGPath
    self.layer.mask = layer

到 visualLayer 属性。

如果没有让您走上正确的道路,那应该可以帮助您。

于 2016-05-04T00:47:15.827 回答