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

时间:2016-01-23 13:33:27

标签: ios swift rotation swift2 core-graphics

以下是我用来执行的代码:

  • 保存上下文
  • 将上下文移动到rect的中间
  • 旋转上下文
  • 从旋转的原点
  • 中绘制一条线
  • 恢复上下文
  • 重复

    for i in 1...60 {
        CGContextSaveGState(ctx)
        CGContextTranslateCTM(ctx, rect.width / 2, 0)
        CGContextRotateCTM(ctx, 6 * CGFloat(i))
        CGContextSetStrokeColorWithColor(ctx, UIColor.grayColor().CGColor)
        CGContextMoveToPoint(ctx, 0, 0)
        if (i % 5 == 0) {
            CGContextSetLineWidth(ctx, 3.0)
            CGContextAddLineToPoint(ctx, 0, 20)
        }
        else {
            CGContextSetLineWidth(ctx, 2.0)
            CGContextAddLineToPoint(ctx, 0, 15)
        }
        CGContextStrokePath(ctx)
        CGContextRestoreGState(ctx)
    }
    

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

我是Core Graphics的新手,所以我只是误解了这段代码是如何工作的?如果没有,问题是什么?

问候,布兰登

1 个答案:

答案 0 :(得分:2)

你去吧

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)
}

导致

enter image description here

<强>解释

首先:修正的度数/弧度算术。

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

其次:正确的几何形状。

  • 在开头用x和y翻译,以时钟为中心
  • 50翻译为右侧
  • 画一条线&#34;向内&#34; 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)

完成工作场所:

{{1}}