views:

112

answers:

1

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. :-)

+1  A: 

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.

Eli
Interesting. You just need to handle the "bounce-back" at the edges and the scroll indictators and you've pretty much cloned the behaviour of Apple's UIScrollView
rpetrich
True, this method is indeed lacking in the pretty bounciness, and it also doesn't go past the edges if you drag extra.
Eli