1

Apple 在去年发布 UICollectionViews 时发布了一个圆形布局的示例。我正在使用它来让我使用圆形布局。问题是我想使用 5 个单元格,而这恰好排列起来很奇怪:

在此处输入图像描述

我不是一个数学天才,坦率地说,我很难理解下面的代码是如何使一切循环的:

- (UICollectionViewLayoutAttributes*) layoutAttributesForItemAtIndexPath:(NSIndexPath *)path {
          UICollectionViewLayoutAttributes *attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:path];
          attributes.size = CGSizeMake(ITEM_SIZEw, ITEM_SIZEh);
          attributes.center = CGPointMake(_center.x +_radius *
                                cosf(2 * path.item * M_PI / _cellCount),
                                _center.y + _radius *
                                sinf(2 * path.item * M_PI/ _cellCount));

          return attributes;
 }

那么如何调整这个数学,使圆圈布局向左旋转 90 度?或者看起来像这样:

在此处输入图像描述

4

2 回答 2

1

此行进行定位:

attributes.center = CGPointMake(_center.x +_radius *
                    cosf(2 * path.item * M_PI / _cellCount),
                    _center.y + _radius *
                    sinf(2 * path.item * M_PI/ _cellCount));

(0,0)以一定角度环绕的圆上的点α(向上,从圆的最右边开始)具有坐标(radius * cos(α), radius * sin(α))

所以你可以从代码中看到第一项放在右边。请注意, cosf 不采用度数,而是采用弧度作为其参数。

要将第一个项目放在顶部,只需将 90° ( =π/2) 添加到角度。所以引用的代码应该是:

attributes.center = CGPointMake(_center.x +_radius *
                    cosf(2 * path.item * M_PI / _cellCount + M_PI / 2),
                    _center.y + _radius *
                    sinf(2 * path.item * M_PI/ _cellCount + M_PI / 2));
于 2013-09-04T23:32:45.603 回答
1

更改_center.x + _radius * cosf(…)_center.x - _radius * sinf(…)和 。_center.y + _radius * sinf(…)__center.y - _radius * cosf(…)

相对于中心,您在圆上的角度 α 的点位于x=r*cos(α)和处y=r*sin(α)。这对应于公共坐标系,其中角度是从 x 轴以逆时针方向测量的。但是对于 α=0,您需要顶部位置,这是x=0, y=-r假设轴指向下方的标准计算机坐标系y如果它指向上方,则翻转符号。在 α=0 你有sin(α)=0, cos(α)=1,所以你想要x=±r*sin(α), y=-r*cos(α)。现在随着你增加 α,cos 会减少(这是你想要的,向下移动)并且 sin 会增加。所以如果你想逆时针移动,那么你想减去那个罪,即x=-r*sin(α)。添加中心的坐标,重新使用现有的 α 表达式,就完成了。

于 2013-09-04T23:35:00.720 回答