gpt4 book ai didi

ios - 使用 KVO 快速观察 view.center for ios 返回 NSPoint?

转载 作者:行者123 更新时间:2023-11-28 11:09:47 25 4
gpt4 key购买 nike

这是代码

view.addObserver(self, forKeyPath: "center", options: .New, context: nil)

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
guard let change = change else {
return
}

print(change)

guard let newCenter = change["new"] else {
return
}

print(newCenter.dynamicType)
}

输出是:

["new": NSPoint: {50, 50.5}, "kind": 1]
NSConcreteValue

我不知道为什么NS类会出现在iOS中。如何使用 KVO 和 swift 正确观察 view.center/frame/transform?

最佳答案

由于 KVO 是 Objective-C 运行时的一部分,因此更改字典是 NSDictionary,而不是原生 Swift 字典。 NSDictionary 只能保存 Objective-C 对象(这就是为什么在 Swift 中,它变成了 [String:AnyObject],而不是 [String:Any] ),并且 CGPoint 不是 Objective-C 对象。所以 KVO 必须将 CGPoint 包装在一个对象中。

NSValue 是一个通用的 Objective-C 类,用于包装非对象,当观察到的属性类型不是对象类型时,KVO 使用它。 NSValue 是一个“类簇”,这意味着它定义了一个接口(interface),并且可能有专门的、非公共(public)的子类来实现该接口(interface)。在这种情况下,您会看到其中一个子类的名称:NSConcreteValue

您可以通过询问 CGPointValue 属性从 NSValue 获取 CGPoint 值:

guard let newCenter = change["new"]?.CGPointValue else {
return
}

打印更改字典时看到 NSPoint 的原因是历史的偶然。 NSPoint 类型早于 CGPoint,但现在是 OS X 上 CGPoint 的别名(在 Foundation/NSGeometry.h 中定义) ),并且在 iOS 上根本不存在。但是,用于打印 NSPoint/CGPoint 的代码并未更改为使用新名称(可能是为了向后兼容),并且在 OS X 和 iOS 上都使用了相同的代码。

关于ios - 使用 KVO 快速观察 view.center for ios 返回 NSPoint?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35858200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com