public LayoutDimensions PrecalculateCellLayoutData(CellData cellData, LayoutAxis axis)
    {
        // Set up the proxy cell to reflect the same layout and rect as our cell would be instantiated as
        var recyclerCell = CellPool.CellProxy.GetComponent <IRecyclableCell>();
        var proxyRtx     = (RectTransform)CellPool.CellProxy.transform;

        recyclerCell.OnCellInstantiate();
        recyclerCell.OnCellShow(cellData);
        LayoutRebuilder.ForceRebuildLayoutImmediate(proxyRtx);

        LayoutAxis initialAxis =
            (ICellLayout.LayoutGroup is VerticalCellLayout) ? LayoutAxis.Horizontal : LayoutAxis.Vertical;
        LayoutAxis secondaryAxis =
            (initialAxis == LayoutAxis.Horizontal) ? LayoutAxis.Vertical : LayoutAxis.Horizontal;

        var             iLayout  = CellPool.CellProxy.GetComponent <ILayoutElement>();
        Action <string> dbgPrint = (string msg) =>
        {
            //Debug.Log(string.Format("{0} proxyRtx.rect.size = {1} preferredSize = {2} minSize = {3} flexibleSize = {4}",
            //    msg,
            //    proxyRtx.rect.size,
            //    new Vector2(iLayout.preferredWidth, iLayout.preferredHeight),
            //    new Vector2(iLayout.minWidth, iLayout.minHeight),
            //    new Vector2(iLayout.flexibleWidth, iLayout.flexibleHeight)));
        };

        Action <string> placeCell = (string message) =>
        {
            PlaceCell(proxyRtx, initialAxis);
            dbgPrint(message + "Initial Axis: ");
            PlaceCell(proxyRtx, secondaryAxis);
            dbgPrint(message + "Secondary Axis: ");
        };

        placeCell("FIRST FRAME (1): ");

        LayoutRebuilder.ForceRebuildLayoutImmediate(proxyRtx);

        placeCell("FIRST FRAME (2): ");

        CoroutineRunner.WaitForEndOfFrame(() => placeCell("SECOND FRAME: "));

        return(GetProxyLayoutDimensions(axis));
    }