What is the Swift equivalent of UIGestureRecognizerStateEnded? - ios

I'm trying to detect when a pan gesture ends. Under Objective-C, I would do something like the following:
- (void)panGesture:(UIPanGestureRecognizer *)gesture {
if (gesture.state == UIGestureRecognizerStateEnded) {
...
}
}
In my Swift project, it doesn't recognize UIGestureRecognizerStateEnded... Maybe I just need to import something different(?)

The equivalent is just
gesture.state == .Ended
or if you like
gesture.state == UIGestureRecognizerState.Ended

Related

Segment.selectedSegmentIndex is always returning a zero

I'm trying to use a Segmentcontroller.
When a button is press my callback gets call,
but when i use .selectedSegmentIndex to see what button was press, it returns a zero.
code
-(IBAction)changeSeg{
int g;
g=Segment.selectedSegmentIndex;
if(Segment.selectedSegmentIndex == 0){
UpperLower=0;
}
if(Segment.selectedSegmentIndex == 1){
UpperLower=1;
}
}
I think the method should look like this
- (IBAction)ChangeSeg:(UISegmentedControl *)sender {
if(sender.selectedSegmentIndex == 0){
UpperLower=0;
} else if(sender.selectedSegmentIndex == 1){
UpperLower=1;
}
}
The sender will have the selectedSegmentIndex that was chosen.

How do I link all the UISlider events to one method?

I have the following method in my view-controller:
- (IBAction)itemSlider:(UISlider *)itemSlider withEvent:(UIEvent*)e;
{
UITouch * touch = [e.allTouches anyObject];
if( touch.phase != UITouchPhaseMoved && touch.phase != UITouchPhaseBegan)
{
}
else if( touch.phase != UITouchPhaseMoved && touch.phase != UITouchPhaseBegan)
{
}
...
}
Do I really need to link all the events one by one to my controller?
if you are seeking to capture the value changed on slider , then you may follow up the below tutorials instead of using touch events.
http://www.techrepublic.com/blog/software-engineer/better-code-uislider-basics-for-apple-ios/

Adding a UIPanGestureRecognizer and a UISwipeGestureRecognizer to same view causes conflicts after setting requireGestureToFail

I added a swipe gesture recognizer and a pan gesture recognizer to the same view. These gestures should be exclusive to each other.
In order to do this I added the constraint on the swipe gesture
[swipeGesture requireGestureToFail:panGesture];
(because the pan gesture should get precedence)
Problem is that the pan gesture is always invoked - even during a very fast swipe.
In order to over come this I set myself as the pan gesture's delegate. In the delegate method I set up some code as follows:
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// check if it is the relevant view
if (gestureRecognizer.view == self.myViewWithTwoGestures)
{
// check that it is the pan gesture
if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]])
{
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint velocity = [pan velocityInView:gestureRecognizer.view];
// added an arbitrary velocity for failure
if (ABS(velocity.y) > 100)
{
// fail if the swipe was fast enough - this should allow the swipe gesture to be invoked
return NO;
}
}
}
return YES;
}
Is there a suggested velocity to ensure good behavior? Is there another way to force the pan gesture to fail?
According to Apple's documentation here (under Declaring a Specific Order for Two Gesture Recognizers) the way to get both UIPanGestureRecognizer and UISwipeGestureRecognizer to work on the same view is by requiring the UISwipeGesureRecognizer to fail before calling the UIPanGestureRecognizer (the opposite of what you wrote). This probably has something to do with the fact the a swipe gesture is also a pan gesture but the opposite is not necessarily true (see this SO question).
I wrote this little piece of code and it manages to recognize both pan and swipe gestures:
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:#selector(panned:)];
UISwipeGestureRecognizer * swipe = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:#selector(swiped:)];
[pan requireGestureRecognizerToFail:swipe];
swipe.direction = (UISwipeGestureRecognizerDirectionLeft | UISwipeGestureRecognizerDirectionRight);
-(void)panned:(UIPanGestureRecognizer *)gesture
{
NSLog(#"Pan");
}
-(void)swiped:(UISwipeGestureRecognizer *)gesture
{
NSLog(#"Swipe");
}
This doesn't work as well as you'd hope (since you need the swipe gesture to fail there's a small delay before the pan gesture starts) but it does work.
The code you posted however gives you the ability to fine tune the gestures to your liking.
Late response, but I was having a similar issue where I wanted to pan to be recognized before the swipe. The only way I could get it working was to use a long press (or something similar) to set a flag to use the pan gesture as a pan or a swipe. I ended up not using swipes at all. I.e.:
- (void) handleLongPress : (UILongPressGestureRecognizer *) gestureRecognizer
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan)
{
_canSwipe = YES;
}
else if (gestureRecognizer.state == UIGestureRecognizerStateEnded)
{
_canSwipe = NO;
}
}
- (void) handleDragging : (id) sender
{
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)sender;
GLKVector2 dragDelta = GLKVector2Make(0., 0.);
if (pan.state == UIGestureRecognizerStateBegan || pan.state == UIGestureRecognizerStateChanged)
{
_mousePosition = [pan translationInView:self.view];
if (_beginDragging == NO)
{
_beginDragging = YES;
}
else
{
dragDelta = GLKVector2Make(_mousePosition.x - _prevMousePosition.x, _mousePosition.y - _prevMousePosition.y);
}
_prevMousePosition = _mousePosition;
}
else
{
_beginDragging = NO;
}
if (_canSwipe == YES)
{
if (dragDelta.x > 0)
{
_canSwipe = NO;
[self.navigationController popToRootViewControllerAnimated:YES];
NSLog(#"swipe right");
}
else if (dragDelta.x < 0)
{
_canSwipe = NO;
[self performSegueWithIdentifier:#"toTableSegue" sender:pan];
NSLog(#"swipe left");
}
}
else
{
_dragDeltaTranslation = GLKVector2Make(dragDelta.x/90, dragDelta.y/90);
_translationXY = GLKVector2Make(_translationXY.x + _dragDeltaTranslation.x, _translationXY.y - _dragDeltaTranslation.y);
}
}
So essentially:
Use long press (or some other mechanism) to activate a state of swiping (long press is nice because as soon as you release, the state goes to UIGestureRecognizerStateEnded)
Then use the pan direction to determine the direction of the swipe.
2.

UITapGestureRecognizer not working with UIButton

UITapGestureRecognizer *PressRecognizer1 = [[UITapGestureRecognizer alloc] initWithTarget:self action:#selector(handlePress:)];
[PressRecognizer1 setNumberOfTouchesRequired:1];
[firstBtn addGestureRecognizer:PressRecognizer1];
-(void)handlePress:(UITapGestureRecognizer*)PressRecognizer {
NSLog(#"working");
if (PressRecognizer.state == UIGestureRecognizerStateBegan) {
UIButton *whichButton=(UIButton *)[PressRecognizer view];
NSLog(#"whichButton %d\n",whichButton.tag);
if (whichButton.tag == 0) {
NSLog(#"currentImageId1 %d",currentImageId1);
[delegate imageZoom:currentImageId1];
}
I have created a UITabelView with customcell which has three images per row.When tap on a image hadlePress method called.But i does not come inside first if condition.
from apple docs:
Although taps are discrete gestures, they are discrete for each state of the gesture recognizer; thus the associated action message is sent when the gesture begins and is sent for each intermediate state until (and including) the ending state of the gesture. Code that handles tap gestures should therefore test for the state of the gesture, for example:
- (void)handleTap:(UITapGestureRecognizer *)sender {
if (sender.state == UIGestureRecognizerStateEnded)
{
// handling code
}
}
if you NSLog(#"%d",sender.state) inside the method (before the if statement) you'll see that the method is getting fired only with the UIGestureRecognizerStateEnded state, thus you should change your
if (PressRecognizer.state == UIGestureRecognizerStateBegan)
to
if (PressRecognizer.state == UIGestureRecognizerStateEnded)

Touch and hold in TableViewCell to show (tooltip) popover is it possible in iPhone?

According to image could you please advise me which function use to develop this feature?
i'm not sure, is it implement from UIPopover?
any idea, thank you.
source from Music.app iOS 5 beta 2
You can use a UIGestureRecognizer. Specifically, what you are looking for is a UILongPressGestureRecognizer
You should instantiate one and attach it to the view you would like to track the gesture on:
UILongPressGestureRecognizer* gestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:#selector(handleGesture:)];
[view addGestureRecognizer:gestureRecognizer];
Then, in your handler method you would do the rest:
- (void)handleGesture:(UILongGestureRecognizer *)recognizer {
if (recognizer.state == UIGestureRecognizerStateBegan) {
} else if (recognizer.state == UIGestureRecognizerStateEnded) {
}
}
EDIT: for the popover implementation, have a look at WEPopover

Resources