没有调用SKView上的KVO



我试图在SKView的属性上做KVO,但它不起作用。

我已经用。frame试过了,效果很好,为什么不试试。window呢?

澄清一下,我在SwiftUI应用程序中使用SpriteView,我试图获得视图的边界。我所追求的是在应用程序启动之前获得以下内容;

打印(自我。convertPoint(fromView: .zero))。当我在

中使用这个时
override func didMove

我去找Nan/Nan。然而,苹果代码级支持说,使用SpriteView和获取视图的边界。

接收NaN的原因是您正在调用这些方法在底层SKView被SwiftUI实际呈现之前,哪个事件是你无法看到的,也无法调用的

然而,当这个事件发生时,SKScene的view属性将让它的窗口从nil设置为一个UIWindow。因此,您可以使用KVO观察窗口属性何时发生变化,然后使您的当有一个非空窗口时,调用convertPoint。

到目前为止我有这个:

override func didMove(to view: SKView) {
observe.observe(object: view )
}
class Observer:SKScene {
var kvoToken: NSKeyValueObservation?

func observe(object: SKView) {
kvoToken = object.observe(.window , options: [ .new] ) { (object, change) in
guard let value = change.newValue else { return }
print("New value is: (value)")
print ("NEW", self.convertPoint(fromView: .zero) )

}
}

deinit {
kvoToken?.invalidate()
}
}

我也试着添加一个观察者,像这样:

NotificationCenter.default.addObserver(view.window, selector: #selector(test(_:)), name: NSNotification.Name(rawValue: "TestNotification"), object: nil)

以上内容似乎没有任何作用。所以我有点卡住了,任何帮助都会很感激。

答案(可能)…

我看不懂"。UIView的window属性,所以我开始寻找另一个可观察属性,它会在UIWindow = nil时改变。我想我在skscene。view。frame中找到了它。我不完全确定这是一个100%的好答案,但它是有效的。

class Observer: NSObject {
dynamic var kvoToken: NSKeyValueObservation?

func observe(object: SKScene )  {
kvoToken = object.observe(.view?.frame , options: [ .new] ) { (object, change) in
guard let value = change.newValue else { return }
print("New value is: (value)")
print ("CONVERTING", object.convertPoint(fromView: .zero) )

}
}

deinit {
kvoToken?.invalidate()
}
}
override func didMove(to view: SKView) {

viewer = view.scene
observe.observe(object: viewer )
}

最新更新