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

时间:2012-11-04 19:26:01

标签: iphone objective-c ios cocoa-touch uikit

我在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 wantFullScreenLayout范围是:[ - 25.5 .. 449]

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

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


状态栏和NO wantFullScreenLayout 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)


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

3 个答案:

答案 0 :(得分:0)

因为状态栏超出了视图的限制。当你触摸状态栏时,你会得到负值。

试试这个:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    UITouch* touch = [touches anyObject];
    CGPoint point = [touch locationInView:[touch window]];
    NSLog(@"%@", NSStringFromCGPoint(point));
}

答案 1 :(得分:0)

我从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坐标以获得您期望的结果。希望这会有所帮助。

答案 2 :(得分:0)

根视图控制器的视图始终像纵向模式一样。您应该在根目录中插入新视图。根据Apple的说法,这个新视图将正确运行,将提供正确的大小和坐标。

例如

;

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

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

touchPoint将是正确的。