CAShapeLayer 不可见

Posted

技术标签:

【中文标题】CAShapeLayer 不可见【英文标题】:CAShapeLayer isn't visible 【发布时间】:2016-08-03 20:16:36 【问题描述】:

我有一个UIView 的子类连接到UIViewControllerXIB 文件。

我正在使用PocketSVG 将我的SVG 文件转换为CGPath,如下所示:

override func awakeFromNib() 
        let myPath = PocketSVG.pathFromSVGFileNamed("").takeUnretainedValue()

        let myShapeLayer = CAShapeLayer()
        myShapeLayer.path = myPath

        myShapeLayer.strokeColor = UIColor.redColor().CGColor
        myShapeLayer.lineWidth = 3
        myShapeLayer.fillColor = UIColor.whiteColor().CGColor

        self.layer.addSublayer(myShapeLayer)
    

问题是,当我运行应用程序时,我什么都看不到,图层也不可见。

我现在做错了什么?

谢谢!

【问题讨论】:

如果你断点并打印myShapeLayer,它的框架是什么?乍一看,好像你没有给形状图层一个框架,这意味着它的框架是CGRectZero,它不会出现在屏幕上。 首先,你确定你得到一个有效的CGPathRef 吗?我会检查myPath。其次,当您覆盖awakeFromNib 时,您可能需要调用super @keithbhunter 是的,框架是0,0,0,0,要改成self.view @Rob 如何查看myPathPocketSVG 返回 CGPath Reframe的形状层,设置为self.view.bounds。回复myPath,确保它不为空。其次,你可以调用各种 CGPath 函数,比如CGPathGetPathBoundingBox,看看你是否从中得到了一个合理的矩形。 【参考方案1】:

鉴于您为 CGPathGetPathBoundingBox 报告的内容,您可能需要转换路径,使其位于窗口的可见部分内。

例如,如果您想翻译和缩放它以使其适合视图:

let insetRect = CGRectInset(bounds, lineWidth / 2.0, lineWidth / 2.0)
let boundingRect = CGPathGetPathBoundingBox(myPath)
let scale = min(insetRect.size.height / boundingRect.size.height, insetRect.size.width / boundingRect.size.width)
var transform = CGAffineTransformScale(CGAffineTransformMakeTranslation(-boundingRect.origin.x * scale + insetRect.origin.x, -boundingRect.origin.y * scale + insetRect.origin.y), scale, scale)

let transformedPath = CGPathCreateMutableCopyByTransformingPath(myPath, &transform)

这个想法有很多排列,但希望它能说明这个概念。

【讨论】:

谢谢!那行得通!!但尺寸比它应该的小,我希望它是视图的大小。我该怎么做? 我将其设置为使用在视图中适合整个事物所需的最小比例。你的路径非常宽,但不是很高,所以它会在视图的顶部看起来蜷缩起来。您可以根据需要调整此scale。您也可以调整transform(例如将其居中或您拥有什么)。或者,也许您让用户通过捏合缩放来调整scale 您能告诉我如何将其设置为视图的最大尺寸吗? 如果你使用max而不是min,它可能会填满视图(但它也会切断一些)。 您能否分享一个更新的代码示例让我更好地理解这一点?

以上是关于CAShapeLayer 不可见的主要内容,如果未能解决你的问题,请参考以下文章

如何通过方向更改控制视图可见性(可见/不可见)? [复制]

使对话框可见然后不可见

Focusky教程 | 不可见帧和可见帧的区别

使一个 div 可见而另一个不可见

Flutter 中的不可见性、消失、可见性 ROW 和列

访问 collectionView 单元格可见/不可见