簡體   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