简体   繁体   English

允许触摸通过UICollectionView到达其Superview

[英]Allow touches to pass through a UICollectionView to it's Superview

Let's say I have a ViewController with a UICollectionView sitting on it. 假设我有一个带有UICollectionView的ViewController。 How can I get Touches to pass through the UICollectionView and into the ViewController's TouchesBegan / TouchesMoved / TouchesEnded functions? 如何让Touches通过UICollectionView并进入ViewController的TouchesBegan / TouchesMoved / TouchesEnded函数? I've done this many times with UIScrollViews simply by setting ExclusiveTouch = false and the touch would then be allowed to pass through the UIScrollView to it's superview. 我已经通过设置ExclusiveTouch = false使用UIScrollViews进行了很多次,然后允许触摸通过UIScrollView到达其超级视图。 But that same approach doesn't work with UICollectionViews . 但是,这种方法不适用于UICollectionViews Any ideas? 有任何想法吗?

Set's up UICollectionView : 设置UICollectionView

partial class CyanViewController : BaseViewControllerWithCollection
{

    /*--------------------------------------------------------------------------------*/
    // Constructors
    /*--------------------------------------------------------------------------------*/

    public CyanViewController (IntPtr handle) : base (handle)
    {
    }

    /*--------------------------------------------------------------------------------*/

    public override void ViewDidLoad ()
    {
        base.ViewDidLoad ();

        // Setup collection view
        this.SetupCollectionView();
    }

    /*--------------------------------------------------------------------------------*/

    public override void TouchesBegan (NSSet touches, UIEvent evt)
    {
        base.TouchesBegan (touches, evt);

        Console.WriteLine ("TouchesBegan");
    }

    /*--------------------------------------------------------------------------------*/
    // Private Methods
    /*--------------------------------------------------------------------------------*/

    private void SetupCollectionView ()
    {
        Console.WriteLine ("SetupCollectionView");
        try
        {
            // Instantiate collection view
            this.CollectionView = new UICollectionView(
                this.View.Bounds,
                new UICollectionViewFlowLayout() { 
                    ScrollDirection = UICollectionViewScrollDirection.Vertical,
                    ItemSize = new CGSize(75, 115),
                    SectionInset = new UIEdgeInsets(20, 20, 20, 20)
                }
            );

            // Setup delegate and data source
            this.CollectionView.Delegate = new ProductTypeCollectionViewDelegate(this);
            this.CollectionView.DataSource = new ProductTypeCollectionViewDataSource(this);
            this.CollectionView.RegisterClassForCell(typeof(BaseCollectionViewCell), BaseCollectionViewCell.s_millaCellId);
        }
        catch (Exception ex)
        {
            Console.WriteLine ("Exception : " + ex.Message);
            Console.WriteLine ("Exception : " + ex.StackTrace);
        }

        // Add collection view to view
        this.View.AddSubview(this.CollectionView);
    }

    /*--------------------------------------------------------------------------------*/
    // Class: SeedsCollectionViewDataSource
    /*--------------------------------------------------------------------------------*/

    public class ProductTypeCollectionViewDataSource : UICollectionViewDataSource
    {

        /*--------------------------------------------------------------------------------*/
        // Properties
        /*--------------------------------------------------------------------------------*/

        private CyanViewController _parentController;

        /*--------------------------------------------------------------------------------*/
        // Constructors
        /*--------------------------------------------------------------------------------*/

        public ProductTypeCollectionViewDataSource (
            CyanViewController a_parentController
        )
        {
            this._parentController = a_parentController;
        }

        /*--------------------------------------------------------------------------------*/

        private ProductTypeCollectionViewDataSource ()
        {
            throw new NotImplementedException ();
        }

        /*--------------------------------------------------------------------------------*/
        // UICollectionViewDataSource Implementation
        /*--------------------------------------------------------------------------------*/

        public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
        {
            var cell = (BaseCollectionViewCell)collectionView.DequeueReusableCell (BaseCollectionViewCell.s_millaCellId, indexPath);

            cell.Label.Text = "Woot";

            return cell;
        }

        /*--------------------------------------------------------------------------------*/

        public override nint GetItemsCount (UICollectionView collectionView, nint section)
        {
            return 10;
        }

        /*--------------------------------------------------------------------------------*/

    }

    /*--------------------------------------------------------------------------------*/
    // Class: SeedsCollectionViewDelegate
    /*--------------------------------------------------------------------------------*/

    public class ProductTypeCollectionViewDelegate : UICollectionViewDelegate
    {

        /*--------------------------------------------------------------------------------*/
        // Properties
        /*--------------------------------------------------------------------------------*/

        private CyanViewController _parentController;

        /*--------------------------------------------------------------------------------*/
        // Constructors
        /*--------------------------------------------------------------------------------*/

        public ProductTypeCollectionViewDelegate (
            CyanViewController a_parentController
        )
        {
            this._parentController = a_parentController;
        }

        /*--------------------------------------------------------------------------------*/

        private ProductTypeCollectionViewDelegate ()
        {
            throw new NotImplementedException ();
        }

        /*--------------------------------------------------------------------------------*/
        // UICollectionViewDelegate Implementation
        /*--------------------------------------------------------------------------------*/

        public async override void ItemSelected (UICollectionView collectionView, NSIndexPath indexPath)
        {
            Console.WriteLine ("ItemSelected indexPath.Row = " + indexPath.Row);
        }

        /*--------------------------------------------------------------------------------*/

    }

    /*--------------------------------------------------------------------------------*/

}

Sets up UIViewController that holds the CollectionView . 设置保存CollectionView UIViewController I want to get touches in TouchesBegan / Moved / Ended here! 我想在TouchesBegan / Moved / Ended这里得到触摸!

partial class BaseViewControllerWithCollection : UIViewController
{

    /*--------------------------------------------------------------------------------*/
    // Properties
    /*--------------------------------------------------------------------------------*/

    public UICollectionView CollectionView { get; set; }

    /*--------------------------------------------------------------------------------*/
    // Constructors
    /*--------------------------------------------------------------------------------*/

    public BaseViewControllerWithCollection (IntPtr handle) : base (handle)
    {
        this.View.ExclusiveTouch = false;
        this.View.UserInteractionEnabled = true;
    }

    public override void TouchesBegan (NSSet touches, UIEvent evt)
    {
        base.TouchesBegan (touches, evt);

        Console.WriteLine ("TouchesBegan");
    }

    public override void TouchesMoved (NSSet touches, UIEvent evt)
    {
        base.TouchesMoved (touches, evt);

        Console.WriteLine ("TOuchesMoved");
    }

    public override void TouchesEnded (NSSet touches, UIEvent evt)
    {
        base.TouchesEnded (touches, evt);

        Console.WriteLine ("TouchesSended");
    }

    /*--------------------------------------------------------------------------------*/

}

This is my UICollectionView Class. 这是我的UICollectionView类。 I couldn't get touches in the UIViewController so I tried getting them here, but couldn't.... 我无法在UIViewController触摸,所以我尝试将其触摸到此处,但是无法...。

public class MyCollectionView : UICollectionView
{
    public MyCollectionView ( CGRect frame, UICollectionViewLayout layout ) : base (frame, layout)
    {
        this.ExclusiveTouch = false;
        this.UserInteractionEnabled = true;

        this.BackgroundView.UserInteractionEnabled = true;
        this.BackgroundView.ExclusiveTouch = false;
    }

    public override void TouchesBegan (NSSet touches, UIEvent evt)
    {
        base.TouchesBegan (touches, evt);

        Console.WriteLine ("MyCollectionVIew TouchesBegan");
    }

    public override void TouchesMoved (NSSet touches, UIEvent evt)
    {
        base.TouchesMoved (touches, evt);

        Console.WriteLine ("MyCollectionVIew TouchesMoved");
    }

    public override void TouchesEnded (NSSet touches, UIEvent evt)
    {
        base.TouchesEnded (touches, evt);

        Console.WriteLine ("MyCollectionVIew TouchesEnded");
    }
}

I don't know if this is the correct way, but overriding touchesBegan, etc. in the collection view subclass, and calling it on super as well as on the nextResponder seems to work. 我不知道这是否正确,但是在collection view子类中覆盖touchesBegan等,并在super和nextResponder上调用它似乎可行。 In Objective-C, I did this, 在Objective-C中,我这样做了

@implementation RDCollectionView

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

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

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

Then, in the underlying view, I also implemented these three methods, and handled the touches. 然后,在基础视图中,我还实现了这三种方法,并处理了相关内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM