TouchMoved 和错误的屏幕范围?还是 iOS 中的错误?

Posted

技术标签:

【中文标题】TouchMoved 和错误的屏幕范围?还是 iOS 中的错误?【英文标题】:TouchMoved and wrong screen range? or Bug in iOS? 【发布时间】:2012-11-04 19:26:00 【问题描述】:

我在 ios 中发现了有趣的错误,但我试图相信我错了。你必须做两件事:

1) 为 iOS 创建单视图模板

2) 在 ViewController.m 中编写小函数:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 

    UITouch* touch = [touches anyObject];
    CGPoint point = [touch locationInView:[touch view]];
    NSLog(@"%@", NSStringFromCGPoint(point));
// so u can detect points of your touch

因此,如果您尝试在显示屏上从屏幕的顶部移动到底部(纵向模式)- 您会得到 [-5.5 .. 469] 范围内的点...我无法解释这一点,它只发生在设备上,在模拟器中可以正常工作。

一些调试信息:

带状态栏和 NO WantedFullScreenLayout 范围是:[-25.5 .. 449]

带状态栏和YES WantsFullScreenLayout 范围是:[-5.5 .. 469]

没有状态栏和 NO/YES FullScreenLayout 范围是:[-5.5 .. 469]


带状态栏和 NO WantsFullScreenLayout view.frame 是 (0, 20, 320, 460) 并且 view.bounds 是 (0, 0, 320, 460)

带有状态栏和YES WantsFullScreenLayout view.frame 是 (0, 0, 320, 480) 并且 view.bounds 是 (0, 0, 320, 480)

没有状态栏和 NO/YES FullScreenLayout view.frame 是 (0, 0, 320, 480) 并且 view.bounds 也是 (0, 0, 320, 480)


请帮忙解释一下这些东西,它只发生在设备上...

【问题讨论】:

你考虑到状态栏了吗?尝试在您的视图控制器上设置wantsFullScreenLayout 并再次测试。 带状态栏并且没有想要FullScreenLayout 范围是:[-25.5 .. 449] 带状态栏和YES WantsFullScreenLayout 范围是:[-5.5 .. 469] 没有状态栏和 NO/YES FullScreenLayout 范围是:[-5.5 .. 469] 这很奇怪。请添加NSLog(@"%@", NSStringFromCGPoint(self.view)); 并发布输出 【参考方案1】:

因为状态栏超出了视图的范围。当您触摸状态栏时,您会得到负值。

试试这个:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 

    UITouch* touch = [touches anyObject];
    CGPoint point = [touch locationInView:[touch window]];
    NSLog(@"%@", NSStringFromCGPoint(point));

【讨论】:

带状态栏并且没有想要FullScreenLayout 范围是:[-25.5 .. 449] 带状态栏和YES WantsFullScreenLayout 范围是:[-5.5 .. 469] 没有状态栏和 NO/YES FullScreenLayout 范围是:[-5.5 .. 469] @user1229413 你为什么做同样的 cmets? 哦,对不起。我是***的新手。我的意思是我在有和没有状态栏的情况下测试了它。所有范围都很奇怪【参考方案2】:

我是从 Apple 的手指绘画程序教程之一中找到的:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    CGRect              bounds = [self bounds];
    UITouch*    touch = [[event touchesForView:self] anyObject];
    firstTouch = YES;
    // Convert touch point from UIView referential to OpenGL one (upside-down flip)
    location = [touch locationInView:self];
    location.y = bounds.size.height - location.y;

看起来您需要将触摸转换为 OpenGL 坐标才能获得您期望的结果。希望这会有所帮助。

【讨论】:

GLPaint 中也有同样的错误,如果你在这里写 NSLog(@"%@", NSStringFromCGPoint(location)) 你会得到错误的范围 - [-5,5 .. 469]跨度> 【参考方案3】:

根 viewController 的视图总是像竖屏模式。您应该在根视图内插入一个新视图。而且这个新视图会正确运行,会根据 Apple 的说法给出正确的大小和坐标。

例如;

UIView *v = self;
while ([[v superview] superview] != NULL) 
    v = [v superview];


UITouch *touch = [touches anyObject];
CGPoint touchPoint = [touch locationInView:v];

touchPoint 是正确的。

【讨论】:

以上是关于TouchMoved 和错误的屏幕范围?还是 iOS 中的错误?的主要内容,如果未能解决你的问题,请参考以下文章

错误的iOS8状态栏?

iOS之扩大UIButton(UIView)的点击范围

防止从 UIImageView 到 superview 的触摸传输

对于相同的 iPhone 5s,iOS 模拟器在 ios 7.1 和 ios 8.2 之间具有不同的屏幕高度

请教大神 在touchmoved方法中如何获取移动时x y相对触摸点移动了多

在范围内找不到 MPRemoteCommandCenter