[英]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.