Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 子视图中的NSView touchesMovedWithEvent正在暂停具有内置触控板的SKScene,但不是magic触控板?_Objective C_Macos_Cocoa_Nsview_Trackpad - Fatal编程技术网

Objective c 子视图中的NSView touchesMovedWithEvent正在暂停具有内置触控板的SKScene,但不是magic触控板?

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

我有一个自定义的NSView子类,它被用作我的项目中的子视图。它检测Nstouch并收集其上的物理数据,然后在其drawRect的verbose模式方法中绘制这些内容。同时,SpriteKit场景渲染它所渲染的内容

但是,当我在内置触控板上移动手指时,SpriteKit视图中的所有渲染都会暂停,直到触摸再次静止。在Magic触控板上,帧率会下降,但渲染不会完全停止。在这两种情况下,子视图TKDetectorView将继续渲染接触点

有问题的触摸移动方法:

-(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];
}