允许触摸通过UICollectionView传递给它的Superview

Lam*_*ade 6 uiscrollview xamarin.ios ios xamarin uicollectionview

假设我有一个UICollectionView坐在它上面的ViewController .如何让Touches通过UICollectionView和进入ViewController的TouchesBegan/ TouchesMoved/ TouchesEnded函数?我UIScrollViews只是通过设置完成了这么多次,ExclusiveTouch = false然后触摸将被允许通过UIScrollView它的超视图.但是同样的方法不起作用UICollectionViews.有任何想法吗?

设置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);
        }

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

    }

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

}
Run Code Online (Sandbox Code Playgroud)

设置UIViewController保持CollectionView.我想在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");
    }

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

}
Run Code Online (Sandbox Code Playgroud)

这是我的UICollectionView班级.我无法接触,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");
    }
}
Run Code Online (Sandbox Code Playgroud)

rde*_*mar 3

我不知道这是否是正确的方法,但在集合视图子类中重写 TouchBegan 等,并在 super 和 nextResponder 上调用它似乎可行。在 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];
}
Run Code Online (Sandbox Code Playgroud)

然后,在底层视图中,我也实现了这三个方法,并对触摸进行了处理。