Objective c 子视图中的NSView touchesMovedWithEvent正在暂停具有内置触控板的SKScene,但不是magic触控板?
我有一个自定义的NSView子类,它被用作我的项目中的子视图。它检测Nstouch并收集其上的物理数据,然后在其drawRect的verbose模式方法中绘制这些内容。同时,SpriteKit场景渲染它所渲染的内容 但是,当我在内置触控板上移动手指时,SpriteKit视图中的所有渲染都会暂停,直到触摸再次静止。在Magic触控板上,帧率会下降,但渲染不会完全停止。在这两种情况下,子视图TKDetectorView将继续渲染接触点 有问题的触摸移动方法:Objective c 子视图中的NSView touchesMovedWithEvent正在暂停具有内置触控板的SKScene,但不是magic触控板?,objective-c,macos,cocoa,nsview,trackpad,Objective C,Macos,Cocoa,Nsview,Trackpad,我有一个自定义的NSView子类,它被用作我的项目中的子视图。它检测Nstouch并收集其上的物理数据,然后在其drawRect的verbose模式方法中绘制这些内容。同时,SpriteKit场景渲染它所渲染的内容 但是,当我在内置触控板上移动手指时,SpriteKit视图中的所有渲染都会暂停,直到触摸再次静止。在Magic触控板上,帧率会下降,但渲染不会完全停止。在这两种情况下,子视图TKDetectorView将继续渲染接触点 有问题的触摸移动方法: -(void)touchesMovedW
-(void)touchesMovedWithEvent:(NSEvent *)event {
for(NSTouch* touch in [event touchesMatchingPhase:NSTouchPhaseAny inView:self]) {
[touch_identities setObject:touch forKey:[touch identity]];
}
[self phys_record];
if(![self needsDisplay]) {
[self setNeedsDisplay:YES];
}
}
来自详细模式函数断点的数据,其中我同时触摸了内置触摸板(#0)和魔术触摸板(#1):
我认为这可能是SpriteKit渲染线程在手指移动时被不断修改的位置数组打断的结果,但这并不能解释为什么它只发生在MacBook Air的内置触摸板上,而不是外部Magic触摸板上。我找不到设备之间触摸的解释之间的相关差异 原始假设:对于TouchsMoved事件,内置触控板的轮询率明显高于magic触控板,从而导致更多DrawRect并中断SpriteKit视图的绘图线程 失败-增加touchesMovedWithEvent调用数和setNeedsDisplay中drawRect调用数的计数器显示,在同一时间段内,内置和Magic Trackpad之间的数量没有显著差异 解决方案: touchesMovedWithEvent调用setNeedsDisplay,用于方法末尾的自定义视图 取消touchesMovedWithEvent中的setNeedsDisplay调用,而是在SpriteKit场景的更新方法中调用自定义视图的setNeedsDisplay,从而“从上方”操作该子视图,解决了此问题。 txmyscene:
-(void)update {
[detector setNeedsDisplay:YES];
}
而不是TKDetectorView
-(void)touchesMovedWithEvent {
[self setNeedsDisplay:YES];
}
-(void)touchesMovedWithEvent {
[self setNeedsDisplay:YES];
}