Reputation: 3172
I need to get every touch points when a user moves his finger on a view.
This is how I get the points in my CustomView.m
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesMoved:touches withEvent:event];
UITouch *touch = [[touches allObjects] objectAtIndex:0];
CGPoint touchLocation = [touch locationInView:self];
NSLog(@"touch location is %f", touchLocation.x);
}
Then I check the log, the output is:
2016-05-23 19:49:45.116 AutoLayoutTest[32321:3809723] touch location is 6.000000
2016-05-23 19:49:45.134 AutoLayoutTest[32321:3809723] touch location is 10.500000
2016-05-23 19:49:45.151 AutoLayoutTest[32321:3809723] touch location is 17.500000
2016-05-23 19:49:45.169 AutoLayoutTest[32321:3809723] touch location is 29.000000
2016-05-23 19:49:45.185 AutoLayoutTest[32321:3809723] touch location is 41.500000
2016-05-23 19:49:45.202 AutoLayoutTest[32321:3809723] touch location is 52.000000
2016-05-23 19:49:45.220 AutoLayoutTest[32321:3809723] touch location is 62.500000
2016-05-23 19:49:45.237 AutoLayoutTest[32321:3809723] touch location is 68.500000
2016-05-23 19:49:45.254 AutoLayoutTest[32321:3809723] touch location is 77.000000
2016-05-23 19:49:45.272 AutoLayoutTest[32321:3809723] touch location is 84.500000
2016-05-23 19:49:45.288 AutoLayoutTest[32321:3809723] touch location is 90.000000
2016-05-23 19:49:45.305 AutoLayoutTest[32321:3809723] touch location is 96.000000
2016-05-23 19:49:45.322 AutoLayoutTest[32321:3809723] touch location is 100.500000
2016-05-23 19:49:45.339 AutoLayoutTest[32321:3809723] touch location is 105.500000
2016-05-23 19:49:45.357 AutoLayoutTest[32321:3809723] touch location is 109.500000
2016-05-23 19:49:45.374 AutoLayoutTest[32321:3809723] touch location is 116.000000
2016-05-23 19:49:45.391 AutoLayoutTest[32321:3809723] touch location is 121.000000
2016-05-23 19:49:45.409 AutoLayoutTest[32321:3809723] touch location is 127.000000
2016-05-23 19:49:45.426 AutoLayoutTest[32321:3809723] touch location is 132.500000
2016-05-23 19:49:45.443 AutoLayoutTest[32321:3809723] touch location is 138.500000
2016-05-23 19:49:45.460 AutoLayoutTest[32321:3809723] touch location is 145.000000
2016-05-23 19:49:45.478 AutoLayoutTest[32321:3809723] touch location is 151.000000
2016-05-23 19:49:45.495 AutoLayoutTest[32321:3809723] touch location is 156.000000
2016-05-23 19:49:45.512 AutoLayoutTest[32321:3809723] touch location is 161.500000
2016-05-23 19:49:45.529 AutoLayoutTest[32321:3809723] touch location is 166.500000
2016-05-23 19:49:45.546 AutoLayoutTest[32321:3809723] touch location is 173.000000
2016-05-23 19:49:45.563 AutoLayoutTest[32321:3809723] touch location is 178.500000
2016-05-23 19:49:45.580 AutoLayoutTest[32321:3809723] touch location is 183.500000
2016-05-23 19:49:45.597 AutoLayoutTest[32321:3809723] touch location is 189.000000
2016-05-23 19:49:45.614 AutoLayoutTest[32321:3809723] touch location is 194.000000
2016-05-23 19:49:45.632 AutoLayoutTest[32321:3809723] touch location is 199.500000
2016-05-23 19:49:45.649 AutoLayoutTest[32321:3809723] touch location is 204.000000
2016-05-23 19:49:45.666 AutoLayoutTest[32321:3809723] touch location is 209.500000
2016-05-23 19:49:45.683 AutoLayoutTest[32321:3809723] touch location is 214.500000
2016-05-23 19:49:45.700 AutoLayoutTest[32321:3809723] touch location is 220.000000
2016-05-23 19:49:45.717 AutoLayoutTest[32321:3809723] touch location is 224.000000
2016-05-23 19:49:45.735 AutoLayoutTest[32321:3809723] touch location is 229.000000
2016-05-23 19:49:45.752 AutoLayoutTest[32321:3809723] touch location is 233.500000
2016-05-23 19:49:45.769 AutoLayoutTest[32321:3809723] touch location is 237.500000
2016-05-23 19:49:45.786 AutoLayoutTest[32321:3809723] touch location is 240.500000
2016-05-23 19:49:45.803 AutoLayoutTest[32321:3809723] touch location is 244.000000
2016-05-23 19:49:45.821 AutoLayoutTest[32321:3809723] touch location is 247.000000
2016-05-23 19:49:45.838 AutoLayoutTest[32321:3809723] touch location is 249.000000
2016-05-23 19:49:45.855 AutoLayoutTest[32321:3809723] touch location is 251.000000
2016-05-23 19:49:45.872 AutoLayoutTest[32321:3809723] touch location is 252.000000
2016-05-23 19:49:45.889 AutoLayoutTest[32321:3809723] touch location is 254.000000
2016-05-23 19:49:45.907 AutoLayoutTest[32321:3809723] touch location is 255.000000
2016-05-23 19:49:45.925 AutoLayoutTest[32321:3809723] touch location is 256.000000
2016-05-23 19:49:45.955 AutoLayoutTest[32321:3809723] touch location is 256.500000
2016-05-23 19:49:46.056 AutoLayoutTest[32321:3809723] touch location is 257.500000
2016-05-23 19:49:46.073 AutoLayoutTest[32321:3809723] touch location is 258.500000
2016-05-23 19:49:46.090 AutoLayoutTest[32321:3809723] touch location is 260.500000
2016-05-23 19:49:46.108 AutoLayoutTest[32321:3809723] touch location is 261.500000
2016-05-23 19:49:46.125 AutoLayoutTest[32321:3809723] touch location is 262.500000
2016-05-23 19:49:46.142 AutoLayoutTest[32321:3809723] touch location is 263.500000
2016-05-23 19:49:46.159 AutoLayoutTest[32321:3809723] touch location is 264.500000
2016-05-23 19:49:46.191 AutoLayoutTest[32321:3809723] touch location is 265.000000
2016-05-23 19:49:46.268 AutoLayoutTest[32321:3809723] touch location is 265.500000
2016-05-23 19:49:46.293 AutoLayoutTest[32321:3809723] touch location is 266.500000
2016-05-23 19:49:46.317 AutoLayoutTest[32321:3809723] touch location is 267.000000
2016-05-23 19:49:46.334 AutoLayoutTest[32321:3809723] touch location is 268.000000
2016-05-23 19:49:46.355 AutoLayoutTest[32321:3809723] touch location is 269.000000
2016-05-23 19:49:46.387 AutoLayoutTest[32321:3809723] touch location is 269.500000
2016-05-23 19:49:46.412 AutoLayoutTest[32321:3809723] touch location is 270.000000
2016-05-23 19:49:46.443 AutoLayoutTest[32321:3809723] touch location is 271.000000
2016-05-23 19:49:46.488 AutoLayoutTest[32321:3809723] touch location is 272.000000
2016-05-23 19:49:46.544 AutoLayoutTest[32321:3809723] touch location is 272.500000
2016-05-23 19:49:46.598 AutoLayoutTest[32321:3809723] touch location is 273.500000
2016-05-23 19:49:46.624 AutoLayoutTest[32321:3809723] touch location is 274.000000
PLEASE TAKE NOTE: THE PRINTED VALUE IS ONLY THE VALUE AT X AXIS. Because I only care about the change in x axis.
The problem is why are there some points that are not detected? I am expecting that when a user drags his finger on the view, the captured points should be 6, 7, 8, 9, 10, 11 not 6, 10, 17, 29, 41...
I am pretty much sure that when I tested by dragging my finger on the view, I did it at a normal speed, it's not a swipe. So I don't think the captured points should be like this.
I also tried getting the points from a pan gesture recogniser. The result is very much the same.
Am I doing it wrong? Or is there any better way to do this?
Upvotes: 1
Views: 1225
Reputation: 714
The iPad screen is scanned at a frequency of 60 Hz. What you get as touch point coordinates is where the finger was when scanning took place at the finger location. The scanning itself is done by an electrical pulse of 400 µs duration per line of the digitizer grid.
With newer iPads this frequency was bumped up to 120 Hz (iPad Air 2 and 2 mini), and the iPad Pro line even scans at 240 Hz. You get these intermediate points with the coalesced touches functionality. Here is how it is done in objC:
- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
for (UITouch *touch in touches) {
for (UITouch* coalescedTouch in [event coalescedTouchesForTouch:touch]) {
CGPoint newPoint = [coalescedTouch locationInView:self];
}
}
}
If the finger movement is fast enough, even then you will have gaps in the coordinates. Interpolate to get the time when the finger was at the intermediate location - the screen will not give you more precision.
Upvotes: 1
Reputation: 6112
It's about the precision. You can't do anything as the user moves his finger too much fast to get each pixel as value.
Upvotes: 2