【问题标题】:How to draw to CAShapeLayer in a UIView independently?如何在 UIView 中独立绘制到 CAShapeLayer?
【发布时间】:2015-12-11 19:42:20
【问题描述】:

我正在继续我的 Swift 作业,我一直盯着 here(上一个 StackOverflow 问题)。但我现在面临一个新问题。最后,我可以使用下面的代码使用UIBezierPathCAShapeLayer 在我的河流图像上画点(在@njuri 的帮助下):

import UIKit

let beginPoint = UIBezierPath(ovalInRect: CGRectMake(130, 360, 20, 20))
let endPoint = UIBezierPath(ovalInRect: CGRectMake(260, 57, 20, 20))

let drawingView = UIView.init(frame: CGRect(x: 0, y: 0, width: 640, height: 400))
drawingView.addSubview(UIImageView(image: UIImage(named: "River.jpeg")))

let drawingLayer = CAShapeLayer()
drawingLayer.path = beginPoint.CGPath
drawingLayer.strokeColor = UIColor.greenColor().CGColor
drawingLayer.lineWidth = 3
drawingLayer.fillColor = UIColor.whiteColor().CGColor

drawingView.layer.addSublayer(drawingLayer)

let drawingLayer2 = CAShapeLayer()
drawingLayer2.path = endPoint.CGPath
drawingLayer.strokeColor = UIColor.redColor().CGColor
drawingLayer.lineWidth = 3
drawingLayer.fillColor = UIColor.whiteColor().CGColor

drawingView.layer.addSublayer(drawingLayer2)

这里的问题是结果不是我预期的那样,正如你在下面看到的那样,我确实有两个点,但一个全黑(而不是红色边框和白色填充),另一个是绿色边框,填充白色(如我所愿)

但是,为什么会发生这种情况?根据代码,我在这里有两个单独的CAShapeLayers,它们具有不同的属性,我分别添加到 UIView 中

【问题讨论】:

  • 这是一个常见的问题,当您复制粘贴一些重复的代码时,您会忘记重命名变量并且不会出现错误,因为副本变量在此范围内可用。有一个辅助函数可以让你的代码更安全、更简单。

标签: ios swift uibezierpath cashapelayer


【解决方案1】:

您似乎已复制/粘贴并忘记将 drawingLayer 重命名为 drawingLayer2

let drawingLayer2 = CAShapeLayer()
drawingLayer2.path = endPoint.CGPath
drawingLayer2.strokeColor = UIColor.redColor().CGColor
drawingLayer2.lineWidth = 3
drawingLayer2.fillColor = UIColor.whiteColor().CGColor

所以,drawingLayer2 只是使用 strokeColorlineWidthfillColor 的默认值

您可以创建一个函数来简化您的代码。而不是复制和粘贴,这容易出错。

func addDotWithPath(path: UIBezierPath) -> CAShapeLayer {
    let drawingLayer = CAShapeLayer()
    drawingLayer.path = path.CGPath
    drawingLayer.strokeColor = UIColor.greenColor().CGColor
    drawingLayer.lineWidth = 3
    drawingLayer.fillColor = UIColor.whiteColor().CGColor
    return drawingLayer
}

drawingView.layer.addSublayer(addDotWithPath(beginPoint))
drawingView.layer.addSublayer(addDitWithPath(endPoint))

【讨论】:

    【解决方案2】:
    let drawingLayer2 = CAShapeLayer()
    drawingLayer2.path = endPoint.CGPath
    drawingLayer.strokeColor = UIColor.redColor().CGColor
    drawingLayer.lineWidth = 3
    drawingLayer.fillColor = UIColor.whiteColor().CGColor
    

    你只是忘记了一些绘图层2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多