我有一个包含四个集合视图的视图。我正在尝试检测我收到长按手势的单元格。我安装了手势识别器,它对于视图顶部(物理上不是分层次)的集合视图工作正常,但不适用于其余部分。
请尝试以下代码:
using System;
using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;
namespace ConsoleApplication13
{
class ExcelWorker : IDisposable
{
private Excel.Application _excelApp;
private Excel.Workbook _workbook;
private Excel.Worksheet _mainWorksheet;
private readonly string _workbookPath;
public ExcelWorker(string workbookPath)
{
_workbookPath = workbookPath;
}
public void Start()
{
_excelApp = new Excel.Application();
_excelApp.Visible = true;
var workbooks = _excelApp.Workbooks;
_workbook = workbooks.Open(_workbookPath,
0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
true, false, 0, true, false, false);
var workheets = _workbook.Worksheets;
_mainWorksheet = (Excel.Worksheet) workheets.Item[1];
}
public void DoStuff()
{
var cell = (Excel.Range)_mainWorksheet.Cells[4, "U"];
cell.set_Value(Missing.Value, 99);
}
public void Stop()
{
if (_workbook != null)
{
_workbook.Close(false, Missing.Value, Missing.Value);
_workbook = null;
_mainWorksheet = null;
}
if (_excelApp != null)
{
_excelApp.Quit();
_excelApp = null;
}
GC.Collect();
GC.WaitForPendingFinalizers();
}
public void Dispose()
{
Stop();
}
}
class Program
{
static void Main(string[] args)
{
using (var excelWorker = new ExcelWorker(@"C:\.....xlsx"))
{
excelWorker.Start();
excelWorker.DoStuff();
excelWorker.DoStuff();
}
Console.ReadKey();
}
}
}
它正在为TopCollectionView而不是其他人工作。点p确实显示了正确的坐标。手势识别器回调位于viewcontroller中,包含4个集合视图作为其子视图。
答案 0 :(得分:2)
根据docs
方法indexPathForItemAtPoint
期望在其坐标系中使用CGPoint
。
因此,为了解决您的问题,您应该添加更多代码。
首先,你应该认识到哪个collectionView frame
里面有CGPoint
。
您可以使用此方法bool CGRectContainsPoint(CGRect rect, CGPoint point);
然后当你知道哪个collectionView触摸是你应该将它转换为它的坐标系
CGPoint p = [self.view convertPoint:p toView:collectionView];
然后调用
indexPath = [self.theCollectionView indexPathForItemAtPoint:p];
请注意:
如果你在单元格之间点击(而不是直接在实际单元格上),你就不会获得单元格indexPath
答案 1 :(得分:1)
我的问题是:如果你使用
为你的UICollectionView设置了一个插图func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets
然后你需要相应地调整你的CGPoint.x的值,否则 indexPathForItemAtPoint:将找不到插入lyes的空间中的任何项目。