注意:我不太明白 Frédéric 的回答,所以我自己解决了这个问题,并提出了似乎相同的解决方案。我想我不妨解释一下我做了什么,以防万一。
首先,我将视图的纵横比标准化为项目的纵横比。(我假设您不想旋转项目。)
a = (view_width/view_height) / (item_width/item_height)
Run Code Online (Sandbox Code Playgroud)
现在a用正方形包装一个宽/高比的矩形相当于用项目包装视图。理想的情况是我们的网格(现在是正方形)完全填充矩形,这会给我们
a = c/r
Run Code Online (Sandbox Code Playgroud)
其中r和c是行数和列数:
N = r*c
Run Code Online (Sandbox Code Playgroud)
将这两个方程相乘/相除得到
N*a = c^2 N/a = r^2
c = sqrt(N*a) r = sqrt(N/a)
Run Code Online (Sandbox Code Playgroud)
如果网格是完美的,r并且c是整数,但如果不是,则必须尝试 Frédéric 提到的三个选项,并保留r*c最小但仍大于 的选项N:
floor(r), ceil(c)ceil(r), floor(c)ceil(r), ceil(c)