繁体   English   中英

允许触摸通过UICollectionView到达其Superview

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

假设我有一个带有UICollectionView的ViewController。 如何让Touches通过UICollectionView并进入ViewController的TouchesBegan / TouchesMoved / TouchesEnded函数? 我已经通过设置ExclusiveTouch = false使用UIScrollViews进行了很多次,然后允许触摸通过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);
        }

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

    }

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

}

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

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

}

这是我的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");
    }
}

我不知道这是否正确,但是在collection view子类中覆盖touchesBegan等,并在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];
}

然后,在基础视图中,我还实现了这三种方法,并处理了相关内容。

暂无
暂无

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

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