I tried the following code:
UISwipeGestureRecognizer *showBar = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(gestureShowBar:)];
showBar.direction = UISwipeGestureRecognizerDirectionDown;
showBar.numberOfTouchesRequired = 2;
[self.tableview addGestureRecognizer:showBar];
with no luck! The tableview tends to scroll when I swipe is performed using two fingers. So, I tried disabling multi-touch on tableview and let the superview handle the gesture:
UISwipeGestureRecognizer *showBar = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(gestureShowBar:)];
showBar.direction = UISwipeGestureRecognizerDirectionDown;
showBar.numberOfTouchesRequired = 2;
[self.view addGestureRecognizer:showBar];
Again, it doesn't work! I really wonder why a tableview will respond to two finger swipe although multi-touch is not enabled!
this link describe how to implement pinch gesture in a table row u can adjust swipe gesture instead of it
check out the tableviewcontroller class where handle pinch method is there
http://developer.apple.com/library/ios/#samplecode/TableViewUpdates/Introduction/Intro.html#//apple_ref/doc/uid/DTS40010139
Good luck
Related
I have a UIScrollView inside a UIView. For customized paging purpose I have set the clipping of this UIScrollView to No so the UIScrollView still shows up in Region A and Region B of the UIView.
[ region A [UIScrollView] region B ]
Now I want Region A B to be able to trigger scroll events of the UIScrollView's when touched.. I remember there is an one liner (something like [X addGestureRecognizer ...]) that does the trick but I've forgotten what it is... It would be great if someone can tell me what that is!
If you want to redirect the UIScrollView's scrolling gestures to another view, you can do this:
[paddingView addGestureRecognizer:scrollView.panGestureRecognizer];
This won't let you have a fluid control on your scrolling, like the one you get from the UIScrollView.
However, you can use this code :
UISwipeGestureRecognizer *leftSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(viewSwiped:)];
[leftSwipeGestureRecognizer setDirection:UISwipeGestureRecognizerDirectionLeft];
[self.view addGestureRecognizer:leftSwipeGestureRecognizer];
[leftSwipeGestureRecognizer release];
UISwipeGestureRecognizer *rightSwipeGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(viewSwiped:)];
[rightSwipeGestureRecognizer setDirection:UISwipeGestureRecognizerDirectionRight];
[self.view addGestureRecognizer:rightSwipeGestureRecognizer];
[rightSwipeGestureRecognizer release];
firing this method :
- (void)viewSwiped:(UISwipeGestureRecognizer *)swipeGestureRecognizer {
switch (swipeGestureRecognizer.direction) {
case UISwipeGestureRecognizerDirectionLeft:
// Make your scroll view scroll
break;
case UISwipeGestureRecognizerDirectionRight:
// Make your scroll view scroll
break;
default:
// Do Nothing
break;
}
}
It will allow you to retrieve the swipes gestures and page your UIScrollView accordingly.
Two other solutions might be better :
You could use the UIPanGestureRecognizer the same way as above. It recognizes real pan gestures and not only discrete swipes but the implementation of the sync between your finger and the UIScrollView will be slightly more complicated.
You could let your UIScrollView take the total width of the UIView and manage the paging by yourself, recalculating your steps while tracking the current state of the UIScrollView via UIScrollViewDelegate. Again, a bit harder.
Hope this will help,
I have a UIView and i have added both UILongGestureRecognizer and UIPanGestureRecognizer on the view. When i tap and hold it for some seconds i get callback for LongPress recognized.
Code is as shown below
- (void)addPanGsetureForView:(UIView *)object
{
UIPanGestureRecognizer * panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:#selector(panGestureRecognised:)];
[object addGestureRecognizer:panGesture];
[panGesture release];
}
- (void)addLongPressGsetureForView:(UIView *)object
{
UILongPressGestureRecognizer * longPress = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:#selector(imageLongPressed:)];
[longPress setMinimumPressDuration:1.0];
[object addGestureRecognizer:longPress];
[longPress release];
}
So i want to move the view using Pan gesture. So when the long press is recognized without removing my finger on the view i want the pan gesture to get recognized. If i remove my finger and tap and pan it again it gets recognized.
So please do help me this issue.
Thanks in advance
Taken from Apple's documentation on Gesture Recognizers
Permitting Simultaneous Gesture Recognition
By default, no two gesture recognizers can attempt to recognize their gestures simultaneously. But you can change this behavior by implementing gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:, an optional method of the UIGestureRecognizerDelegate protocol. This method is called when the recognition of the receiving gesture recognizer would block the operation of the specified gesture recognizer, or vice versa. Return YES to allow both gesture recognizers to recognize their gestures simultaneously.
Just tested this and I think it will resolve your issue!
I have added the following gesture recognizers to a view:
UIPinchGestureRecognizer *pch= [[UIPinchGestureRecognizer alloc] initWithTarget:self action:#selector(ViewPinching:)];
[[self view] addGestureRecognizer:pch];
// and
UIPanGestureRecognizer *d = [[UIPanGestureRecognizer alloc] initWithTarget:self action:#selector(ViewDragging:)];
[d setMinimumNumberOfTouches:4];
[[self view] addGestureRecognizer:d];
I want to fire the event when 4 fingers are dragged and when I do that the Pinch gesture recognizer fires instead of the Pan gesture recognizer. I was thinking that maybe I could fix this problem if I restrict the UIPinchGestureRecognizer to be fired only if touches.count=2
edit
I don't know if this will be practical or not. Maybe I could add:
UIPinchGestureRecognizer *pch= [[UIPinchGestureRecognizer alloc] initWithTarget:self action:#selector(ViewPinching:)];
[[self view] addGestureRecognizer:pch];
every time touches start if there is two touches I will add that event and remove it ontouchesended.
This is ultimately a bad idea. A 4-finger pinch in iOS 5 will close your app, and a 4 finger pan will switch to the next app (obviously not good for UX). If you absolutely must use 4 fingers, make a subclass of UIGestureRecognizer and do the pinching logic yourself. Let me apologize ahead of time for not having an example, as your use case is quite unique.
I am using UISwipeGestureRecognizer for left and right direction swipe in my main view as follow:
UISwipeGestureRecognizer *recognizer1,*recognizer;
recognizer1 = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(handleSwipeFromleft:)];
[recognizer1 setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[self.view addGestureRecognizer:recognizer1];
[recognizer1 release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(handleSwipeFromright:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.view addGestureRecognizer:recognizer];
[recognizer release];
and in this same view I am also using touch event like touch begin,move and end.
Both are used for different purpose.
My problem is that when I touch my view and moving it from left to right or right to left;
UISwipeGestureRecognizer is called in between the touch began and touch moved method which i dont want
so anyone know how can i avoid this type of thing?
how can i tell the view that i am now want to use touch event or i am using UISwipeGestureRecognition
Take a look at reference there is a property called cancelsTouchesInView. So the way I see it is to determine if you want to handle the gesture or standard touch in swipeHandlers, and set the cancelsTouchesInView property accordingly
I have a UIView inside of a UIScrollView, both created using IB. The UIView scrolls horizontally inside the UIScrollView. I want to detect left and right 2 finger swipes.
Borrowing from the sample code I found in SmpleGestureRecognizers, I have put the following code in the viewDidLoad method of the UIScrollView's ViewController...
UIGestureRecognizer *recognizer;
UISwipeGestureRecognizer *swipeRightRecognizer, *swipeLeftRecognizer;
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(handleSwipeFrom:)];
swipeRightRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeRightRecognizer.numberOfTouchesRequired = 2;
[self.view addGestureRecognizer:swipeRightRecognizer];
[recognizer release];
recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(handleSwipeFrom:)];
swipeLeftRecognizer = (UISwipeGestureRecognizer *)recognizer;
swipeLeftRecognizer.numberOfTouchesRequired = 2;
swipeLeftRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeftRecognizer];
[recognizer release];
I have set in the viewcontroller.h. and have the following delegate method...
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
return YES;
}
I am assuming this is a valid gestureRecognizer delegate method, but I cannot find any reference to it in the documentation.
I do not get any errors but nothing happens when I do a 2 finger swipe. The delegate method is not called and neither is my action method. I tried removing the numbeOfTouchesRequired call to see if it might work with a single finger swipe to no avail.
Am I adding the gestureRecognizers to the right view? I tried adding it to the UIView, the UIScrollView as well as self.view.superView.
The sample code runs great. The only difference I can see between my implementation of the code and the sample code is the fact that I used IB to create the views and the sample code did not. I suspect that something is consuming the swipe gesture before it gets to my recognizers.
What am I doing wrong.
Thanks,
John
I had the same problem and I solved by using UIPanGestureRecognizer instead of UISwipeGestureRecognizer.
To emulate the detection of swipe, we'll play with the speed of gesture in scrollview.
If the speed of x direction >= 3000 (for example) the swipe will be detected.
If x>0 it will be a right swipe.
The code I implemented to resolve your situation is:
In a uiscrollview named _scroll1:
UIPanGestureRecognizer *pan;
pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:#selector(Swipe4ScrollViews:)];
[pan setMinimumNumberOfTouches:2];
[_scroll1 addGestureRecognizer:pan];
[pan release];
With a global BOOL variable named _panning, Swipe4ScrollViews will do the hard job:
-(void)Swipe4ScrollViews:(UIPanGestureRecognizer *)sender
{
if(sender.state == UIGestureRecognizerStateBegan) _panning = NO;
CGPoint v =[sender velocityInView:_scroll1];
NSLog(#"%f, %f",v.x,v.y);
if( (abs(v.x) >= UMBRAL) && !_panning)
{
_panning = YES;
[sender cancelsTouchesInView];
if(v.x>0) NSLog(#"Right");
else NSLog(#"Left");
[self doSomething];
}
}
I encapsulated it on a UIGestureRecognizer subclass: UISwipe4ScrollGestureRecognizer
The biggest difference between the sample code and your code is that your code involves a UIScrollView.
Internally, scroll views, table views, and web views all use gesture recognizers to some degree. If you're expecting to receive gestures within those views – gestures that are similar to the ones already supported internally – they will almost certainly be consumed or significantly delayed before you can get to them. Receiving gestures outside or above those views should work fine, if your use case supports it.
Try setting the delayContentTouches-property of the UIScrollView to NO, maybe it'll help.