我使用本教程http://www.thinkandbuild.it/building-a-custom-and-designabl-control-in-swift/了解iOS应用程序的自定义控件。在与教程中的控件交互时,我注意到CPU使用率非常高。 现在我对我自己的应用程序使用类似的控件,我的绘图功能导致几乎相同的CPU使用率。我甚至不使用下面示例代码中的渐变。
所以我的问题是,如果我能以任何方式对其进行优化,或者我应该认为自己对使用apple的标准绘图方法可以实现的目标感到满意。
override func drawRect(rect: CGRect){
super.drawRect(rect)
let ctx = UIGraphicsGetCurrentContext()
/** Draw the Background **/
CGContextAddArc(ctx, CGFloat(self.frame.size.width / 2.0), CGFloat(self.frame.size.height / 2.0), radius, 0, CGFloat(M_PI * 2), 0)
UIColor(red: 0.0, green: 0.0, blue: 0.0, alpha: 1.0).set()
CGContextSetLineWidth(ctx, 72)
CGContextSetLineCap(ctx, CGLineCap.Butt)
CGContextDrawPath(ctx, CGPathDrawingMode.Stroke)
/** Draw the circle **/
/** Create THE MASK Image **/
UIGraphicsBeginImageContext(CGSizeMake(self.bounds.size.width,self.bounds.size.height));
let imageCtx = UIGraphicsGetCurrentContext()
CGContextAddArc(imageCtx, CGFloat(self.frame.size.width/2) , CGFloat(self.frame.size.height/2), radius, 0, CGFloat(DegreesToRadians(Double(angle))) , 0);
UIColor.redColor().set()
//Use shadow to create the Blur effect
CGContextSetShadowWithColor(imageCtx, CGSizeMake(0, 0), CGFloat(self.angle/15), UIColor.blackColor().CGColor);
//define the path
CGContextSetLineWidth(imageCtx, Config.TB_LINE_WIDTH)
CGContextDrawPath(imageCtx, CGPathDrawingMode.Stroke)
//save the context content into the image mask
let mask:CGImageRef = CGBitmapContextCreateImage(UIGraphicsGetCurrentContext())!;
UIGraphicsEndImageContext();
/** Clip Context to the mask **/
CGContextSaveGState(ctx)
CGContextClipToMask(ctx, self.bounds, mask)
/** The Gradient **/
// Split colors in components (rgba)
let startColorComps:UnsafePointer<CGFloat> = CGColorGetComponents(startColor.CGColor);
let endColorComps:UnsafePointer<CGFloat> = CGColorGetComponents(endColor.CGColor);
let components : [CGFloat] = [
startColorComps[0], startColorComps[1], startColorComps[2], 1.0, // Start color
endColorComps[0], endColorComps[1], endColorComps[2], 1.0 // End color
]
// Setup the gradient
let baseSpace = CGColorSpaceCreateDeviceRGB()
let gradient = CGGradientCreateWithColorComponents(baseSpace, components, nil, 2)
// Gradient direction
let startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect))
let endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect))
// Draw the gradient
CGContextDrawLinearGradient(ctx, gradient, startPoint, endPoint, []);
CGContextRestoreGState(ctx);
/* Draw the handle */
drawTheHandle(ctx!)
}
下面的代码描述了我绘制句柄的方法。它只创建一个带有白色边界的灰色圆圈。
func drawTheHandle(context: CGContextRef){
CGContextSaveGState(context)
handleCenter = pointFromAngle(Int(-angleInt), radius: wheelRadius, center: centerOfCircle)
grayColor.set();
CGContextAddArc(context, handleCenter.x, handleCenter.y, handleRadius, 0, 360, 0)
CGContextDrawPath(context, CGPathDrawingMode.Fill)
UIColor.whiteColor().set();
CGContextAddArc(context, handleCenter.x, handleCenter.y, handleRadius, 0, 360, 0)
CGContextDrawPath(context, CGPathDrawingMode.Stroke)
CGContextRestoreGState(context);
}