如何使集合视图响应其自身视图之外的平移手势
Posted
技术标签:
【中文标题】如何使集合视图响应其自身视图之外的平移手势【英文标题】:How to make a collectionview respond to pan gestures outside of it's own view 【发布时间】:2016-09-20 13:39:14 【问题描述】:我的UIViewController
中有一个UICollectionView
,我希望它能够响应UICollectionView
内外的手势。默认情况下,UICollectionView
仅响应其自己的view
内的手势,但我怎样才能让它响应其view
之外的滑动?
谢谢。
【问题讨论】:
在您的viewController
中使用touches:began
【参考方案1】:
我写了一个视图子类来完成这个:
#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
在界面生成器中,将包含视图的子视图设置为 TouchForwardingView,然后将集合视图分配给 forwardingTarget 属性。
【讨论】:
【参考方案2】:Nailer 的答案的 Swift 版本,这会将在 viewcontroller 上完成的所有手势转发到 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)
【讨论】:
【参考方案3】:Steven B 对 Swift 4 的回答 :)
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
collectionView.touchesBegan(touches, with: event)
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?)
collectionView.touchesEnded(touches, with: event)
override func touchesCancelled(_ touches: Set<UITouch>?, with event: UIEvent?)
collectionView.touchesCancelled(touches!, with: event)
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?)
collectionView.touchesMoved(touches, with: event)
【讨论】:
以上是关于如何使集合视图响应其自身视图之外的平移手势的主要内容,如果未能解决你的问题,请参考以下文章
UIImageView 没有响应 UIPanGestureRecognizer 手势