快速渲染的CALayers数组与swift中的CAShapeLayers数组

时间:2016-01-25 23:55:39

标签: arrays swift calayer cashapelayer cgpath

我正在编写一个应用程序,其中我需要使用先前定义的bezier路径填充500个左右的层,并且我遇到了PERFORMANCE或INTERACTIVITY问题,具体取决于我选择的路径。请注意,我不需要动画功能,因为我绘制的路径是静态的:

如果我使用CALayers,绘制屏幕的路径大约需要15秒(不好),但最终的交互式体验(即在屏幕上移动)非常棒。

如果我使用CAShapeLayers,绘制到屏幕的路径只需要几分之一秒(好),但交互性很差。

这是我的CALayers代码:

func drawPathToCALayer (myView: UIImageView, pointArray: [CGPoint], bbox: CGRect, color: UIColor) {

// step 1. create path
let path = CGPathCreateMutable()
var pathOffset = CGAffineTransformMakeTranslation( (bbox.origin.x * -1), (bbox.origin.y * -1))
CGPathAddLines(path, &pathOffset, pointArray, pointArray.count)
CGPathCloseSubpath(path)

// step 2. draw to context -- this is the part that kills the amount of time that we call this function repeatedly

UIGraphicsBeginImageContextWithOptions(bbox.size, false, 0)
CGContextAddPath(UIGraphicsGetCurrentContext(), path)
CGContextSetFillColorWithColor(UIGraphicsGetCurrentContext(), color.CGColor)
CGContextFillPath(UIGraphicsGetCurrentContext())

// step 3.  assign context drawing to sublayer
let sublayer = CALayer()
let strokeImage = UIGraphicsGetImageFromCurrentImageContext()
sublayer.frame = bbox
sublayer.contents = strokeImage.CGImage

UIGraphicsEndImageContext()
myView.layer.addSublayer(sublayer)

这是CAShapeLayers的代码

func drawPathToCAShapeLayer (myView: UIImageView, pointArray: [CGPoint], bbox: CGRect, color: UIColor) {

// step 1. create path
let path = CGPathCreateMutable()
var pathOffset = CGAffineTransformMakeTranslation( (bbox.origin.x * -1), (bbox.origin.y * -1))
CGPathAddLines(path, &pathOffset, pointArray, pointArray.count)
CGPathCloseSubpath(path)

// step 2.  assign path to sublayer
let sublayer = CAShapeLayer()
sublayer.path = path
sublayer.fillColor = color
myView.layer.addSublayer(sublayer)

我喜欢CAShapeLayer方法的简洁性和速度,但从交互性的角度来看,这条路线是不行的。

问题是(感谢挂在那里),是否有办法进行混合方法,我暂时将其绘制到CAShapeLayer,并使用它来填充这样的CALayer?

func drawPathToHybrid (myView: UIImageView, pointArray: [CGPoint], bbox: CGRect, color: UIColor) {

// step 1. create path
let path = CGPathCreateMutable()
var pathOffset = CGAffineTransformMakeTranslation( (bbox.origin.x * -1), (bbox.origin.y * -1))
CGPathAddLines(path, &pathOffset, pointArray, pointArray.count)
CGPathCloseSubpath(path)

// step 2.  assign path to sublayer
let sublayer = CALayer()
let tmplayer = CAShapeLayer()
tmplayer.path = path
tmplayer.fillColor = color
sublayer.contents = tmplayer.contents  // ---> i know this doesn't work, but is there something similar I can take advantage of that doesn't rely on defining a context?
myView.layer.addSublayer(sublayer)

或者更好的是,还有其他一些方法可以填充一系列具有贝塞尔路径的CALayers,以获得良好的交互性和性能吗?

0 个答案:

没有答案