CAShapeLayer 不可见
Posted
技术标签:
【中文标题】CAShapeLayer 不可见【英文标题】:CAShapeLayer isn't visible 【发布时间】:2016-08-03 20:16:36 【问题描述】:我有一个UIView
的子类连接到UIViewController
的XIB
文件。
我正在使用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 如何查看myPath
? PocketSVG
返回 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 不可见的主要内容,如果未能解决你的问题,请参考以下文章