Eli
Eli

Reputation: 4932

iPhone how do I know when the user is touching the screen but not moving?

I want to know when a user is touching the screen but not moving. Doing it in a pseudo fashion is simple enough - I know how many touches I have just by using touchesBegan and touchesEnded, but the problem is that only touchesMoved sends events. No events are sent if you aren't moving. This is being used to have a nice sliding scroll - you can fling the scrolling and it will continue to scroll even after you've released, but it will immediately stop if your finger is down but not moving. I can't just set a fingerDown boolean in touchesMoved and then set it false in my loop (where the scrolling and sliding is happening), because they're not synchronized.

Basically, I want to simulate having a touchesNotMoved event - whenever you are moving, a certain bool is true, when you're not moving, it's false.

Also please don't ask me why I'm not just using Apple's scrolling - there's a good reason that has nothing to do with this question. :-)

Upvotes: 2

Views: 230

Answers (1)

Eli
Eli

Reputation: 4932

This isn't the answer to knowing when touches aren't active, but it is a reasonable solution to what I wanted to do, anyway.

So, if anyone else is trying to simulate Apple's scroll views (pixel-perfect scrolling plus a nice fling and slide), then you will want the following:

An integer keeping track of the number of touches.
A loop or timer that is separate from the touch events.
A vector (or two floats) storing a scroll "decay" amount.
A constant float decay value, like 0.95.

Then with those you can do the following:
- In touchesBegan, increment touchCount by [touches count].
- In touchesEnded, decrement touchCount by [touches count].
- In touchesMoved, create a vector that represents currentTouchPos - previousTouchPos.
- Scroll your view by that vector.
- Set your scrollDecay vector equal to that vector.
- In your main timer or loop, scroll your view by the scrollDecay only if touchCount <= 0. In addition, multiply the scrolLDecay vector by the decay value. Once it reaches a very low value (say, 0.1), set it to 0.

And you're done. It works quite well, I can't see any discernible differences between this and Apple's scrolling.

Upvotes: 1

Related Questions