首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么抛出的CGFloat不显示CGFloat行为?

为什么抛出的CGFloat不显示CGFloat行为?
EN

Stack Overflow用户
提问于 2019-03-02 10:12:17
回答 1查看 68关注 0票数 2

我有一个简单的例子,我试着画一个圆圈。下面的代码没有给我一个圆圈。

代码语言:javascript
复制
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.piCGFloat(2.0*Float.pi)的打印语句。

更新代码(我只将endAngle在context.addArc中更改为2.0*CGFloat.pi,而不是CGFloat(2.0*Float.pi)

代码语言:javascript
复制
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中很有用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)。

对于一个完整的圆圈,您可以交替使用

代码语言:javascript
复制
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))

避免所有四舍五入的问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54957375

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档