UICollectionView indexPathForItemAtPoint返回nil

时间:2016-02-03 16:01:35

标签: ios objective-c uicollectionview

我有一个包含四个集合视图的视图。我正在尝试检测我收到长按手势的单元格。我安装了手势识别器,它对于视图顶部(物理上不是分层次)的集合视图工作正常,但不适用于其余部分。

请尝试以下代码:

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个集合视图作为其子视图。

2 个答案:

答案 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的空间中的任何项目。