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)); }