为什么我的线不旋转? -- CGContextRotateCTM

Why Are My Lines Not Rotating? -- CGContextRotateCTM

这是我使用的代码:

输出是几行,都紧紧地聚集在一起。

我是 Core Graphics 的新手,我是不是误解了这段代码的工作原理?如果不是,是什么问题?

此致,布兰登

给你

for i in 0..<60 {
    CGContextSaveGState(ctx)
    CGContextTranslateCTM(ctx, rect.width / 2, rect.height / 2)
    CGContextRotateCTM(ctx, CGFloat(Double(i) * M_PI / 30))
    CGContextSetStrokeColorWithColor(ctx, UIColor.grayColor().CGColor)
    CGContextTranslateCTM(ctx, 50, 0)
    CGContextMoveToPoint(ctx, 0, 0)
    if (i % 5 == 0) {
        CGContextSetLineWidth(ctx, 3.0)
        CGContextAddLineToPoint(ctx, -20, 0)
    } else {
        CGContextSetLineWidth(ctx, 2.0)
        CGContextAddLineToPoint(ctx, -10, 0)
    }
    CGContextStrokePath(ctx)
    CGContextRestoreGState(ctx)
}

导致

解释:

首先:修正度数/弧度算法。

  • 6 * i 以度为单位
  • 需要以弧度为单位 - 因此 * M_PI / 180
  • 6 * i * M_PI / 180可以简化为i * M_PI / 30

其次:正确的几何形状。

  • 开始时按 x 和 y 进行转换,使时钟在其矩形中居中
  • 50翻译到右边
  • 画一条 "inwards" 2010 长的线。向内意思negative

没有内部翻译的替代方案

for i in 0..<60 {
    CGContextSaveGState(ctx)
    CGContextTranslateCTM(ctx, rect.width / 2, rect.height / 2)
    CGContextRotateCTM(ctx, CGFloat(Double(i) * M_PI / 30))
    CGContextSetStrokeColorWithColor(ctx, UIColor.grayColor().CGColor)
    CGContextMoveToPoint(ctx, 50, 0)
    if (i % 5 == 0) {
        CGContextSetLineWidth(ctx, 3.0)
        CGContextAddLineToPoint(ctx, 30, 0)
    } else {
        CGContextSetLineWidth(ctx, 2.0)
        CGContextAddLineToPoint(ctx, 40, 0)
    }
    CGContextStrokePath(ctx)
    CGContextRestoreGState(ctx)
}

完整的工作操场:

import UIKit
import XCPlayground

class CustomView : UIView {
    override func drawRect(rect: CGRect) {
        let ctx = UIGraphicsGetCurrentContext()

        for i in 0..<60 {
            CGContextSaveGState(ctx)
            CGContextTranslateCTM(ctx, rect.width / 2, rect.height / 2)
            CGContextRotateCTM(ctx, CGFloat(Double(i) * M_PI / 30))
            CGContextSetStrokeColorWithColor(ctx, UIColor.grayColor().CGColor)
            CGContextTranslateCTM(ctx, 50, 0)
            CGContextMoveToPoint(ctx, 0, 0)
            if (i % 5 == 0) {
                CGContextSetLineWidth(ctx, 3.0)
                CGContextAddLineToPoint(ctx, -20, 0)
            } else {
                CGContextSetLineWidth(ctx, 2.0)
                CGContextAddLineToPoint(ctx, -10, 0)
            }
            CGContextStrokePath(ctx)
            CGContextRestoreGState(ctx)
        }
    }
}

let v = CustomView(frame: CGRectMake(0,0,200,200))
v.backgroundColor = .lightGrayColor()
XCPShowView("blabla", view: v)