Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Three Layers of Pan Gesture Recogniser Confusion

A Sketch of my App's View Hierarchy

Whilst developing an app I have come up against a problem with having too many pan gesture recognisers. My first pan gesture recogniser is on the MainViewController which is a parent of the RecipeSearchVC. This gesture recogniser slides the whole view left or right. My second pan gesture recogniser in in the RecipeSearchParametersVC which is a parent of a Page View Controller. The third pan gesture gesture recogniser is added to a UIControl Wheel nested inside of a view controller which is represented by the PageViewController.

I know this sounds insane and it could be argued that this is poor design. However, I believe that is this worked cohesively it would be fine.

When trying to rotate the wheel it will rotate for a second or two before the gesture is overtaken by either the PageViewController or the MainViewController. More often than not it is the MainViewController that takes over. What techniques could I employ to clearly separate each of these gesture recognisers?

EDIT:

Apologies for the vagueness of my description when it comes to the pan gesture recognisers. The MainViewController has it's own UIPanGestureRecpgniser to allow it to move everything left or right. The RecipeSearchParametersVC only has a UIPanGestureRecogniser because of the UIPageViewController it contains. It does not add the gesture recogniser itself, but simply takes them from the the pageViewController. The UIControl's gesture recognisers allows it to track the rotation it should undergo.

In taking the advice given, I may remove the gestures from the page view controller and substitue them with buttons. I only intended this to work like the images (which can be scrolled to reveal more images) found in iBooks, and so I thought that it would work fine.

UIControl UIPanGestureRecogniser Code

/**
 *  sent to the control when a touch related to the given event enters the control’s bounds
 *
 *  @param  touch                       uitouch object that represents a touch on the receiving control during tracking
 *  @param  event                       event object encapsulating the information specific to the user event
 */
- (BOOL)beginTrackingWithTouch:(UITouch *)touch
                     withEvent:(UIEvent *)event
{
    [super beginTrackingWithTouch:touch withEvent:event];

    CGPoint touchPoint                  = [touch locationInView:self];

    //  filter out touchs too close to centre of wheel
    CGFloat magnitudeFromCentre         = [self calculateDistanceFromCentre:touchPoint];

    if (magnitudeFromCentre < 40)       return NO;

    //  calculate distance from centre
    CGFloat deltaX                      = touchPoint.x - _container.center.x;
    CGFloat deltaY                      = touchPoint.y - _container.center.y;

    //  calculate the arctangent of the opposite (y axis) over the adjacent (x axis) to get the angle
    _deltaAngle                         = atan2(deltaY, deltaX);

    _startTransform                     = _container.transform;

    //  selection in limbo so set all sector image's to minimum value by changing current one
    [self getSectorByValue:_currentSector].alpha = kMinimumAlpha;

    return YES;
}
like image 781
Infinity James Avatar asked May 21 '13 14:05

Infinity James


1 Answers

Unfortunately due to the nature of my controller hierarchy I was forced to rethink the design of my app.

The MainViewController with the UIPanGestureRecogniser has stayed as is. The UIPageViewController with the UIControl has moved to a separate static view controller.

This works far better but is not yet ideal. The UIPageViewController steals any horizontal panning, however this can probably be fixed by implementing buttons as an alternative to the scrolling.

The UIControl did not have a gesture recogniser, but I override the beginTrackingWithTouch: and other methods to track the touches.

I suppose the answer should be: if you are layering too many gestures, you're doing it wrong.

like image 50
Infinity James Avatar answered Oct 23 '22 14:10

Infinity James