gpt4 book ai didi

iOS 模拟器在随机时间段后停止正确识别手势

转载 作者:行者123 更新时间:2023-12-02 03:01:17 26 4
gpt4 key购买 nike

抱歉,这个时间太长了。这对我来说是一个谜,正在寻找任何人可能有的指示。

iOS 模拟器中 UIGestureRecognizers 的工作方式和传递触摸点的方式似乎存在一个错误,该错误在模拟器重新启动之前一直存在。即使终止应用程序并在模拟器中重新启动它也无法修复它。解决这个问题的唯一方法(暂时)是完全退出模拟器并重新启动它。

我在 UIViewController 子类中有一个 SKView 子类。 SKView 子类占据 UIViewController 的底部部分,顶部部分包含一些按钮和其他控件。该游戏涉及点击和平移,由 UIGestureControllers 管理,这些 UIGestureControllers 由拥有 SKScene 子类的 SKView 子类拥有。

任意一段时间后,手势就会停止正常工作。在 SKScene 拥有的 View 中,它们都无法正确识别。如果我在 SKView 外部和父 UIViewController 中单击,它们就会出现,但坐标都是错误的。它还会导致状态错误 - 有时 UIPanGestureRecognizer 认为有两根手指按下,而不是只有一根。 UIPanGestureRecognizer 同样处于关闭状态。这种行为没有可识别的模式 - 它只是突然开始。

以下是初始化 SKView 及其场景的相关代码:

    SKView * _gameView = [[SKView alloc] initWithFrame : gameRect];
_gameView.clipsToBounds = YES;
// _gameView.scene is an SKScene subclass
CGSize gameSize = CGSizeMake(_gameView.bounds.size.width,
_gameView.bounds.size.width);
_scene = [[GameScene alloc] initWithSize : gameSize];
// Present the scene.
[_gameView presentScene : _scene];
[self.view addSubview : _gameView];

以下是 SKScene 子类中注册 UIGestureController 的代码:

- (void) initializeGestureRecognition : (SKView *) view
{
UIPanGestureRecognizer * panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget : self action : @selector (handlePanGesture:)];
UITapGestureRecognizer * tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget : self action : @selector (handleTapGesture:)];
panRecognizer.delegate = self;
tapRecognizer.delegate = self;
panRecognizer.maximumNumberOfTouches = 2;
[tapRecognizer requireGestureRecognizerToFail : panRecognizer];
[view addGestureRecognizer : panRecognizer];
[view addGestureRecognizer : tapRecognizer];
}

以下是 UIPanGestureRecognizer 的 handlePanGesture 委托(delegate)的代码:

-(void) handlePanGesture : (UIPanGestureRecognizer*) panRecognizer
{
self.deltaInView = [panRecognizer translationInView : self.view];
self.deltaInScene = CGPointMake(deltaInView.x, -(deltaInView.y));
if (UIGestureRecognizerStateChanged == panRecognizer.state)
{
self.panTouchPoint = [self getPanTouchPoint : panRecognizer];
}
else if (UIGestureRecognizerStateEnded == panRecognizer.state)
{
// Other non-relevant stuff here
}
}

- (CGPoint) didGetPanTouchPoint : (UIPanGestureRecognizer*) panRecognizer
{
CGPoint touchPoint = CGPointMake(0.0, 0.0);
if (2 == panRecognizer.numberOfTouches)
{
CGPoint tempPoint = [self calculateSafeCentroidPointFromRecognizer : panRecognizer];
touchPoint = [self convertPointFromView : tempPoint];
}
else if (1 == panRecognizer.numberOfTouches)
{
CGPoint tempPoint = [panRecognizer locationOfTouch : 0
inView : self.view];
touchPoint = [self convertPointFromView : tempPoint];
}
return touchPoint;
}


- (CGPoint) calculateSafeCentroidPointFromRecognizer : (UIGestureRecognizer*) recognizer
{
CGPoint thisPointInView = [recognizer locationOfTouch : 0
inView : self.view];
CGPoint thatPointInView = [recognizer locationOfTouch : 1
inView : self.view];
CGPoint safePoint = [self calculateCentroidPoint : thisPointInView
secondPoint : thatPointInView];
return safePoint;
}


CGPoint CalculateCentroidPoint(const CGPoint * thisPoint,
const CGPoint * thatPoint)
{
CGPoint centroidPoint = CGPointMake((thisPoint->x + thatPoint->x) / 2.0),
(thisPoint->y + thatPoint->y) / 2.0));
return centroidPoint;
}

以下是 UITapGestureRecognizer 的 handleTapGesture 委托(delegate)的代码:

- (void) handleTapGesture : (UIGestureRecognizer *) gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
{
UITapGestureRecognizer * tapRecognizer = (UITapGestureRecognizer*) gestureRecognizer;
CGPoint viewTouchLocation = [tapRecognizer locationOfTouch : 0
inView : self.view];
CGPoint sceneTouchLocation = [self convertPointFromView : viewTouchLocation];
// Do other stuff here
}
}

需要注意的一件有趣的事情是,点击和平移手势识别器都不正确。这不是一个或另一个。这让我相信存在一些系统性问题。

(或者,更有可能的是,我搞砸了一些事情。)

有什么想法吗?

最佳答案

有时,模拟器会认为您按住了 Option () 键并陷入困境,这意味着屏幕上会激活捏合手势助手。要停止此操作,只需再次按 Option。如果这不起作用,请尝试按 Command。

关于iOS 模拟器在随机时间段后停止正确识别手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551606/

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