如何使集合视图响应它自己视图之外的平移手势

我的UIViewController有一个UICollectionView ,我想让它响应UICollectionView内部和外部的手势。 默认情况下, UICollectionView仅响应其自身view的手势,但如何使其响应其view外的滑动?

演示

谢谢。

我写了一个视图子类来完成这个:

 #import  @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 

在界面构建器中,将包含视图的子视图设置为TouchForwardingView,然后将集合视图分配给forwardingTarget属性。

Swiler版本的Nailer’s anwer,这会将在viewcontroller上完成的所有手势转发到collectionview

 override func touchesBegan(touches: Set, withEvent event: UIEvent?) { collectionView.touchesBegan(touches, withEvent: event) } override func touchesEnded(touches: Set, withEvent event: UIEvent?) { collectionView.touchesEnded(touches, withEvent: event) } override func touchesCancelled(touches: Set?, withEvent event: UIEvent?) { collectionView.touchesCancelled(touches, withEvent: event) } override func touchesMoved(touches: Set, withEvent event: UIEvent?) { collectionView.touchesMoved(touches, withEvent: event) } 

Steven B对Swift 4的回答:)

 override func touchesBegan(_ touches: Set, with event: UIEvent?) { collectionView.touchesBegan(touches, with: event) } override func touchesEnded(_ touches: Set, with event: UIEvent?) { collectionView.touchesEnded(touches, with: event) } override func touchesCancelled(_ touches: Set?, with event: UIEvent?) { collectionView.touchesCancelled(touches!, with: event) } override func touchesMoved(_ touches: Set, with event: UIEvent?) { collectionView.touchesMoved(touches, with: event) }