gpt4 book ai didi

ios - 子类化 Material View 不显示 Material 深度

转载 作者:行者123 更新时间:2023-11-30 13:27:30 24 4
gpt4 key购买 nike

我对 MaterialView 进行了子类化并重写了 drawRect 以创建自定义 View ,然后将其添加为我的 tableViewFooter。正如标题所说,我无法深入工作。我在不同的图层/ View 上使用了 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

提前感谢比我更了解图层的人!这是一个 View 示例,我在其中使用 MaterialDepth.Depth2

深入研究 MaterialTableViewCell 的子类

enter image description here

这里的 layer 具有与 visualLayer 相同的路径 enter image description here

这里我没有设置self.layer的图层或路径。有阴影,但 View 或阴影未剪切到可视层。将 ShadowColor 设置为红色,以便您可以看到差异。

enter image description here

最佳答案

这就是深度的工作方式。

MaterialView 是一个复合对象,它使用两个层来实现裁剪边界并仍然提供阴影的能力。名为 visualLayer 的 CAShapLayer 作为子层添加到 View 的支持层。因此,当添加图像时,它实际上被添加到 VisualLayer 中,该 VisualLayer 的 masksToBounds 属性设置为 true,而 Layer 属性的 maskToBounds 属性设置为 false。这允许深度属性显示在layer属性上,并且仍然给出剪切的感觉。

在这一行

receiptEdge.layer.masksToBounds = true

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

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

到 VisualLayer 属性。

这应该会帮助你,即使不能让你走上正确的道路。

关于ios - 子类化 Material View 不显示 Material 深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36986196/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com