Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make a collectionview respond to pan gestures outside of it's own view

I've got a UICollectionView in my UIViewController and I want it to respond to gestures inside AND outside of the UICollectionView. By default the UICollectionView only responds to the gestures inside its own view but how can I make it respond to swipes outside of its view?

demo

Thanks.

like image 658
Steven B. Avatar asked Sep 20 '16 13:09

Steven B.


2 Answers

I wrote a view subclass that accomplishes just this:

#import <UIKit/UIKit.h>

@interface TouchForwardingView : UIView

@property (nonatomic, weak) IBOutlet UIResponder *forwardingTarget;

- (instancetype)initWithForwardingTarget:(UIResponder *)forwardingTarget;


@end

#import "TouchForwardingView.h"

@implementation TouchForwardingView

- (instancetype)initWithForwardingTarget:(UIResponder *)forwardingTarget
{
    self = [super init];
    if (self)
    {
        self.forwardingTarget = forwardingTarget;
    }

    return self;
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    [self.forwardingTarget touchesBegan:touches withEvent:event];
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    [self.forwardingTarget touchesEnded:touches withEvent:event];
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];
    [self.forwardingTarget touchesCancelled:touches withEvent:event];
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    [self.forwardingTarget touchesMoved:touches withEvent:event];
}

@end

In interface builder, set the subview of the containing view to TouchForwardingView, then assign the collection view to the forwardingTarget property.

like image 135
Nailer Avatar answered Oct 15 '22 07:10

Nailer


Swift version of Nailer's anwer, this will forward all gestures done on the viewcontroller to the collectionview

override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
    collectionView.touchesBegan(touches, withEvent: event)
}
override func touchesEnded(touches: Set<UITouch>, withEvent event: UIEvent?) {
    collectionView.touchesEnded(touches, withEvent: event)
}
override func touchesCancelled(touches: Set<UITouch>?, withEvent event: UIEvent?) {
    collectionView.touchesCancelled(touches, withEvent: event)
}
override func touchesMoved(touches: Set<UITouch>, withEvent event: UIEvent?) {
    collectionView.touchesMoved(touches, withEvent: event)
}
like image 34
Steven B. Avatar answered Oct 15 '22 07:10

Steven B.