- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个 SKCameraNode
的简单子(monad)类,我称之为 InteractiveCameraNode
。现在它非常简单:我需要在我的相机位置改变时发生一些事情。这是我所做的:
class InteractiveCameraNode: SKCameraNode {
// MARK: - Properties
var enableInteraction = true
var positionResponders = [(CGPoint, CGPoint) -> Void]()
/// Calls every closure in the `positionResponders` array
override var position: CGPoint {
didSet {
if enableInteraction {
for responder in positionResponders {
responder(oldValue, position)
}
}
}
}
}
由于相机移动时我可能会发生多种情况,因此我有一个闭包数组,当相机的位置发生变化时会调用这些闭包。到目前为止,一切正常,除了 didSet
如果我使用 Action 移动相机,观察者不会被调用。如果我在相机上使用约束使其跟踪一个节点,然后通过一个 Action 移动该节点,它就可以工作。如果我用手移动相机,它就可以工作。为什么它不适用于 Action ?
最佳答案
我之前的回答 100% 不正确。导致我得出这个答案的是我的其他错误,我深表歉意。我今天也学到了一些有用的东西:)
看起来您看到的行为要么是 A) 错误,要么是 B) 我不理解的 Swift/SK 的一些更深层次的机制。
这是一个在 Playground 上对我有用的解决方法:
class Noder: SKSpriteNode {
var myPosition: CGPoint = CGPoint.zero { didSet { print(position) } }
func initialize(scene: SKScene) {
isUserInteractionEnabled = true
scene.addChild(self)
}
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
position = touches.first!.location(in: self.scene!)
}
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
print(self.position)
run(.moveBy(x: -35, y: 0, duration: 0.5), completion: {
self.myPosition = self.position
})
}
}
使用:
// In didmovetoview:
let node = Noder(color: .black, size: CGSize(width: 25, height: 25))
node.initialize(scene: self)
输出,显示实际位置已从 Action 和didSet
更新:
(50.0, -118.0)
(14.9999971389771, -118.0)
但这对于您想要的可能太慢了,所以您最好在 update()
中手动设置 position
或 myPosition
> 每一帧(无论哪一个都适用于 didSet
哈哈..)
(本段归功于混淆)。
此外,我想知道 KVO 是否可以在这里工作。我没有使用过它们,但 CameraNode 已经是一个 NSObject 了……可能需要研究一下,因为这可能是某种错误……
关于swift - SKCameraNode.position didSet 在使用 SKAction 移动时不会被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41601001/
我正在对此进行测试,如果您更改 didSet 中的值,您将不会再次调用 didSet。 var x: Int = 0 { didSet { if x == 9 { x = 10
我在玩 SwiftUI,我有一个看起来像这样的类: class Foo: ObservableObject { @Published var foo: Int! { // Implicit u
这是我在 Swift 中的第一个项目,所以请耐心等待。 punkteLimit 应初始化为值 30。每次更改 slider 值时,都应更新变量的值以及标签。 var punkteLimit: Int
我有这个代码: class Child { var data : String?; func updateData (s: String) { data = s; } } class
我有这个代码: class Bar: UIViewController { lazy var foo = Foo() foo.bar { didSet { barLabel
假设我有一个具有 3 个属性的 ExerciseSet 类:id、name、isEnabled。 我有一个这个类的对象数组: var exerciseSets: [ExerciseSet] = []
我有一个变量,当你设置和改变时我想要一个监听器,而 didSet 似乎是完美的候选者。但是,在我对它的初始测试中,第一个附加触发了 did 集,并且(在我的示例中)JS 加载到我的 webview 中
给定以下类(class), class Spaceship { var position: CGPoint! { didSet { node.posit
xcode 版本:7.3.1 大家好 我正在关注最新的 Stanford Uni iOS 类(class)。在正在创建的其中一个应用程序中,我们创建了一个具有许多属性的结构。 因为它是一个结构,所以我
我正在尝试将数据从我的 cellClass 传递到 viewController。我可以轻松地将标签文本从 cellClass 传递到 vc,但无法在 vc 中设置变量。 这是我的模型类: class
假设我有一个单例经理 class Manager { static let sharedInstance = Manager() var text: String {
假设我有一个数组: var intArray: [Int] = [1,2,3,4,5] { didSet{ //print index of value that was mo
protocol FooType { var num:Int { get set } } class Foo: FooType { var num: Int = 0 {
我们在 didSet 中使用循环时遇到了这种奇怪的行为。我们的想法是我们有一个具有树结构的数据类型,并且在每个元素中我们想要存储该项目所在的级别。因此,在 level 属性的 didSet 中,我们还
我想覆盖属性观察器并调用“super.didSet”。这可能吗? class Foo { var name: String = "" { didSet { print("name has be
我需要在不更改属性值的情况下执行 didSet 中的代码。 最近从Objective-C过来的,好像没有setMyProperty()。 所以我尝试了: self.myProperty = self.
我想知道“didSet”是否适用于数组中的元组。 我正在编写类似下面的代码,我想观察数组中元组的值。可以做那种事吗? var array :[(foo: Int, bar: Int)] = []]{
在此代码中,当文本更改时,将调用 titleEditingChanged(如预期的那样)。但是当它执行行时 investment?.title = sender.text! 它调用 Investmen
我有一个包含图像的 Collection View 。每个 Collection View 项目都有与它们关联的图像和其他数据,例如“grand_total”、“product_id”等。现在每个 C
当我在 didSet 中创建一个递归时,实际上我发现我可以只放一个 return 并且程序从 didSet 退出。但是我没有找到任何地方(我搜索了很长时间)我可以放一个返回词来退出 didSet。那么
我是一名优秀的程序员,十分优秀!