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

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)

【讨论】:

以上是关于如何使集合视图响应其自身视图之外的平移手势的主要内容,如果未能解决你的问题,请参考以下文章

无法在其父视图之外平移手势较小的 UIView

UIImageView 没有响应 UIPanGestureRecognizer 手势

第一响应者时 UISearchBar 上的平移手势

在 SwiftUI 中,如何使手势在容器视图之外处于非活动状态?

处理嵌套 UIScrollViews 中的冲突手势

Xamarin.Forms 第23局:手势识别