为什么我的线不旋转? -- CGContextRotateCTM
Why Are My Lines Not Rotating? -- CGContextRotateCTM
这是我使用的代码:
- 保存上下文
- 将上下文移动到矩形的中间
- 旋转上下文
- 从旋转后的原点画一条线
- 恢复上下文
重复
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 的新手,我是不是误解了这段代码的工作原理?如果不是,是什么问题?
此致,布兰登
给你
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"
20
或 10
长的线。向内意思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)
这是我使用的代码:
- 保存上下文
- 将上下文移动到矩形的中间
- 旋转上下文
- 从旋转后的原点画一条线
- 恢复上下文
重复
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 的新手,我是不是误解了这段代码的工作原理?如果不是,是什么问题?
此致,布兰登
给你
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"
20
或10
长的线。向内意思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)