Subclassed MaterialView未显示MaterialDepth

时间:2016-05-02 15:33:17

标签: ios swift uitableview calayer cosmicmind

我已经将MaterialView子类化并覆盖drawRect来创建自定义视图,然后将其添加为我的tableViewFooter。正如标题所说,我无法深入开展工作。我在不同的图层/视图上使用clipsToBoundsmasksToBounds搞砸了但没有成功。它是一个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
}

屏幕截图显示无深度

No depth being shown

提前感谢那些比我更了解图层的人! 以下是一个视图示例,我已使用MaterialTableViewCell

深入了解MaterialDepth.Depth2的子类

enter image description here

此处layer的{​​{1}}路径相同 enter image description here

这里我没有设置visualLayer的图层或路径。有阴影但视图或阴影没有剪切到可视层。将shadowColor设置为红色,这样你就可以看到差异。

enter image description here

1 个答案:

答案 0 :(得分:0)

深度的运作方式。

MaterialView是一个复合对象,它使用两个图层来实现剪切边界并仍然提供阴影的能力。名为masksToBounds的CAShapLayer作为子图层添加到视图的背衬层。因此,当添加图像时,它实际上被添加到visualLayer,其layer属性设置为true,而layer属性的masksToBounds属性设置为false。这允许深度属性显示在receiptEdge.layer.masksToBounds = true 属性上,并且仍然可以提供剪切感。

在这一行

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

你实际上正在削减深度。所以我会尝试做的事情是设置这个

{{1}}

到visualLayer属性。

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