我有一个简单的例子,我试着画一个圆圈。下面的代码没有给我一个圆圈。
import UIKit
class PlayingCardView: UIView {
override func draw(_ rect: CGRect) {
if let context = UIGraphicsGetCurrentContext(){
context.addArc(center: CGPoint(x: bounds.midX,
y: bounds.midY), radius: 100.0,
startAngle: 0,
endAngle: CGFloat(2.0*Float.pi),
clockwise: true)
context.setLineWidth(5.0)
UIColor.red.setStroke()
context.strokePath()
print(2.0*CGFloat.pi)
print(CGFloat(2.0*Float.pi))
}
}
}这个具有上述代码的是我得到的:
产出:
6.283185307179586 6.283185005187988
分别对应于2.0*CGFloat.pi和CGFloat(2.0*Float.pi)的打印语句。
更新代码(我只将endAngle在context.addArc中更改为2.0*CGFloat.pi,而不是CGFloat(2.0*Float.pi)
import UIKit
class PlayingCardView: UIView {
override func draw(_ rect: CGRect) {
if let context = UIGraphicsGetCurrentContext(){
context.addArc(center: CGPoint(x: bounds.midX,
y: bounds.midY), radius: 100.0,
startAngle: 0,
endAngle: 2.0*CGFloat.pi,
clockwise: true)
context.setLineWidth(5.0)
UIColor.red.setStroke()
context.strokePath()
print(2.0*CGFloat.pi)
print(CGFloat(2.0*Float.pi))
}
}
}我得到了这个画图 (圆圈在那里)
铸造CGFloat与浮子和CGFloat有明显的区别。有人知道这是什么吗?为什么这种行为在Swift中很有用?
发布于 2019-03-02 10:46:43
在64位平台上,CGFloat是(本质上) Double,64位浮点数,而Float是32位浮点数.
因此2.0*Float.pi是“具有32位精度的2位π”,并将其转换为64位数量的CGFloat保留该值,而不增加精度。
这就是为什么2.0*CGFloat.pi != CGFloat(2.0*Float.pi)。前者是“具有64位精度的2π”,应该传递给绘图函数。
在您的特殊情况下,CGFloat(2.0*Float.pi)比2.0*CGFloat.pi小一点点,因此只绘制了一个不可见的短弧(从弧度0.0到大约-0.00000003)。
对于一个完整的圆圈,您可以交替使用
let radius: CGFloat = 100.0
context.addEllipse(in: CGRect(x: bounds.midX - radius, y: bounds.midY - radius,
width: 2.0 * radius, height: 2.0 * radius))避免所有四舍五入的问题。
https://stackoverflow.com/questions/54957375
复制相似问题