当前位置: 首页 > 面试题库 >

在Swift中是否等效于CGPathApply?

凌翔宇
2023-03-14
问题内容

在预发布文档中,似乎没有Swift版本的CGPathApply。是否有同等的或替代的?我正在尝试获取CGPath的所有子路径,以便可以从其他起点重绘它。


问题答案:

斯威夫特3.0

在Swift 3.0中,您可以这样使用CGPath.apply

let path: CGPath = ...
// or let path: CGMutablePath

path.apply(info: nil) { (_, elementPointer) in
    let element = elementPointer.pointee
    let command: String
    let pointCount: Int
    switch element.type {
    case .moveToPoint: command = "moveTo"; pointCount = 1
    case .addLineToPoint: command = "lineTo"; pointCount = 1
    case .addQuadCurveToPoint: command = "quadCurveTo"; pointCount = 2
    case .addCurveToPoint: command = "curveTo"; pointCount = 3
    case .closeSubpath: command = "close"; pointCount = 0
    }
    let points = Array(UnsafeBufferPointer(start: element.points, count: pointCount))
    Swift.print("\(command) \(points)")
}

斯威夫特2.2

通过添加@convention(c),您现在可以CGPathApply直接从Swift进行调用。这是做必要魔术的包装器:

extension CGPath {
    func forEach(@noescape body: @convention(block) (CGPathElement) -> Void) {
        typealias Body = @convention(block) (CGPathElement) -> Void
        func callback(info: UnsafeMutablePointer<Void>, element: UnsafePointer<CGPathElement>) {
            let body = unsafeBitCast(info, Body.self)
            body(element.memory)
        }
        print(sizeofValue(body))
        let unsafeBody = unsafeBitCast(body, UnsafeMutablePointer<Void>.self)
        CGPathApply(self, unsafeBody, callback)
    }
}

(请注意,@convention(c)我的代码中没有提到,但是CGPathApply在Core Graphics模块的声明中使用了它。)

用法示例:

let path = UIBezierPath(roundedRect: CGRectMake(0, 0, 200, 100), cornerRadius: 15)
path.CGPath.forEach { element in
    switch (element.type) {
    case CGPathElementType.MoveToPoint:
        print("move(\(element.points[0]))")
    case .AddLineToPoint:
        print("line(\(element.points[0]))")
    case .AddQuadCurveToPoint:
        print("quadCurve(\(element.points[0]), \(element.points[1]))")
    case .AddCurveToPoint:
        print("curve(\(element.points[0]), \(element.points[1]), \(element.points[2]))")
    case .CloseSubpath:
        print("close()")
    }
}


 类似资料:
  • 问题内容: 我已经用谷歌搜索,但无法找出什么是等效的。 这是我唯一能找到的(Swift的替代方法responsesToSelector:),但在我的情况下并没有太大意义,因为它检查了委托的存在,我没有委托,我只想检查是否存在新的API在设备上运行时是否返回,如果不是,则返回原先的api版本。 问题答案: 如前所述,在 大多数情况下,您可以使用可选的unwrapper运算符来实现所需的功能。这样,当

  • 问题内容: 我正在尝试从Swift的iTu​​nesU中的“开发适用于iPhone和iPad的ios7应用程序”中复制斯坦福Matchismo游戏。 在第3讲幻灯片的第77页上,它显示了使用,这不是Swift上的选项。Swift文档示例显示了一个具有数组的示例,但是我不知道如何使Interface Builder将多个插座连接到同一个/ Array。 有人知道如何做到这一点吗? 我知道我可以创建1

  • 问题内容: 我正在配置Java客户端,它的工作是建立与服务器的TLS连接。我想使用以下3种密码配置客户端: 在Java支持的密码套件中,我找到了相同的密码,但是开头是SSL,而不是TLS。问题是,如果我用以下方法配置了客户端: 这两个列表是否完全相同,并且服务器将对其进行解释?我担心是否为客户端配置了密码,这意味着与某些不同,并且可能某些服务器不支持。我如何确定? 问题答案: 是的,它们是相同的。

  • 问题内容: 我正在尝试查询Firebase,以检查是否有任何用户,然后在返回快照时,我想查看它是否等于nil。我尝试执行此操作,但是我使用的方法不起作用,并且如果快照不等于nil,则只有某种输出。我添加了当前拥有的代码和Firebase中的JSON文本。 JSON数据: 问题答案: 这里发生了几件事,但是最重要的是,您无法测试患儿的存在。如果您考虑一下,那是有道理的:当将一个孩子添加到该位置时,将

  • 问题内容: 我在SceneDelegate中定义了一个let属性。我希望某些ViewController能够在场景中访问它。 在UIKit中,我可以这样访问App Delegate属性: 然后强制转换并指定属性名称… 是否有等效的方法可以从UIViewController的实例获取对视图控制器所在的SceneDelegate的引用? 问题答案: 从iOS 13开始,具有的属性。这些场景中的每一个都

  • 问题内容: 我的要求是拥有一个线程,该线程可以维护BlackBerry设备与服务器之间的套接字连接并交换命令,类似于请求和响应。 我的问题是,我需要这个线程在后台运行 所有的时间 ,并保持提供给用户的UI。因此,当服务器发出命令时,此线程将对其进行解析并更新UI,并且如果BlackBerry用户发出了操作,则该线程会将其发送到服务器,然后服务器将对其进行处理。 我在Android中使用开发了相同的