Can iPad/iPhone Touch Points be Wrong Due to Calibration?

风格不统一 提交于 2020-01-01 09:03:15

问题


I have an iPad application that uses the whole screen (that is, UIStatusBarHidden is set true in the Info.plist file). The main window's and main view's frames are set to (0, 0, 768, 1024). The main view has multitouch enabled.

The view controller has this code to handle touches:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInView:nil];
        NSLog(@"touchesMoved at location %@", NSStringFromCGPoint(location));
    }
}

When I run the app in the simulator, it works pretty much as expected. As I move the mouse from one edge of the screen to the other, reported X values go from 0 to 767. Reported Y values go from 20 to 1023. (It is a known issue that the simulator doesn't report touches in the top 20 pixels of the screen, even when there is no status bar.)

Here's what's weird: When I run the app on an actual iPad, the X values go from 0 to 767 as expected, but reported Y values go from -6 to 1017, not 0 to 1023 as I would expect.

The fact that it seems to work properly on the simulator leads me to suspect that real devices' touchscreens are not perfectly calibrated, and mine is simply reporting Y values that are six pixels off. Can anyone verify that this is the case? Otherwise, is there anything else that could account for the Y values being six pixels off from what I expect?

(In a few days, I should have a second iPad, so I can test this with another device and compare the results.)


回答1:


Doing some quick testing I noticed the same thing. I started a basic view based project with nothing changed but the following code:

(iPadTestsAppDelegate)

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];

    // Override point for customization after app launch    
    viewController.view.multipleTouchEnabled = YES;
    viewController.view.userInteractionEnabled = YES;

    [window addSubview:viewController.view];
    [window makeKeyAndVisible];

    return YES;
}

(iPadTestsViewController)

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        CGPoint location = [touch locationInView:nil];
        NSLog(@"touchesMoved at location %@", NSStringFromCGPoint(location));
    }
}

When I touch the edges of the screen it reports negative numbers on the x-axis and never hits 0 on the y-axis. Adding some variables to keep track of max and min gives me these as the corners of our iPad: {-5, 2}, {758, 2}, {-5, 1019}, {758, 1019}.




回答2:


I'm getting different values for different UIInterfaceOrientations

UIInterfaceOrientation ori = [UIApplication sharedApplication].statusBarOrientation;
CGPoint point = [touch locationInView:self];

Given that, I'd assume this is a software issue, not a device issue.



来源:https://stackoverflow.com/questions/2733868/can-ipad-iphone-touch-points-be-wrong-due-to-calibration

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!