【问题标题】:Using Objective-C macros to access UIView frame measurements in Swift在 Swift 中使用 Objective-C 宏访问 UIView 帧测量
【发布时间】:2016-07-09 20:50:46
【问题描述】:

我刚刚开始在 Xcode 中从 Obj-C 转向 Swift。

没有办法再使用来自#define 的宏了吗?我知道我可以改用let 来定义常量,但我习惯于将这组宏放在我的大多数程序的顶部,例如:

    #define frameMinX CGRectGetMinX(self.frame)
    #define frameMinY CGRectGetMinY(self.frame)
    #define frameMidX CGRectGetMidX(self.frame)
    #define frameMidY CGRectGetMidY(self.frame)
    #define frameMaxX CGRectGetMaxX(self.frame)
    #define frameMaxY CGRectGetMaxY(self.frame)

    #define frameMin CGPointMake(frameMinX, frameMinY)
    #define frameMid CGPointMake(frameMidX, frameMidY)
    #define frameMax CGPointMake(frameMaxX, frameMaxY)

【问题讨论】:

标签: objective-c swift sprite-kit


【解决方案1】:

您不能在 Swift 中使用 #defines,但这些似乎都是在 UIView 的框架上进行的计算,因此您可以扩展 UIView 以将它们添加为计算属性:

extension UIView {
    var frameMinX: CGFloat { return CGRectGetMinX(self.frame) }
    var frameMinY: CGFloat { return CGRectGetMinY(self.frame) }
    var frameMidX: CGFloat { return CGRectGetMidX(self.frame) }
    var frameMidY: CGFloat { return CGRectGetMidY(self.frame) }
    var frameMaxX: CGFloat { return CGRectGetMaxX(self.frame) }
    var frameMaxY: CGFloat { return CGRectGetMaxY(self.frame) }
    var frameMin: CGPoint  { return CGPointMake(frameMinX, frameMinY) }
    var frameMid: CGPoint  { return CGPointMake(frameMidX, frameMidY) }
    var frameMax: CGPoint  { return CGPointMake(frameMaxX, frameMaxY) }
}

使用示例:

UIView 的任何子类中,您可以像使用宏一样使用属性:

class CustomView: UIView {
    func demoProperties() {
        print(frameMinX)
        print(frameMax)
    }
}

let view = CustomView(frame: CGRect(x: 50, y: 100, width: 200, height: 300))

view.demoProperties()

输出:

50.0
(250.0, 400.0)

【讨论】:

  • 谢谢 - 这对我有用!我也忘记了您现在可以将函数设置为非常有用的变量(另一种方式)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多