1

我正在尝试为瓷砖游戏模仿 iPhone Springboard 拖放功能,目前正在使用 MatrixCells 在视图初始化中生成 UIButtons 并将它们添加到视图中。MatrixCells 有一个order标签,它也用于它们自己的按钮 ( [button setTag:[cell order]];)。

当使用 `layoutSubviews' 循环浏览视图中的 UIButtons 以将它们排列在网格中时,它可以正常工作。网格弹出,我的拖动功能允许我随意拖动按钮。

- (void)layoutSubviews {

int row = 0;
int col = 0;
for ( UIButton *button in [self subviews] ) {
    [button setFrame:CGRectMake( col * 80 + 5, row * 80 + 25, 70, 70)];

    if (col < 3) {
        col++;
    }
    else {
        row++;
        col = 0;
    }
}

}

但是,在更改单元格的顺序时,循环通过subviews不起作用,因为我很确定我根本不应该在那里乱搞。所以,我想循环浏览我的MatrixCells并使用它们order来获得适当的视图,然后更改frame. 但是,布局在按钮 0 处变得混乱,我不能再将它们用作按钮。

- (void)layoutSubviews {

int row = 0;
int col = 0;
for (MatrixCell *cell in currentOrder) {
    UIView *view = [self viewWithTag:[cell order]];
    [view setFrame:CGRectMake( col * 80 + 5, row * 80 + 25, 70, 70 )];
    if (col < 3) {
        col++;
    }
    else {
        row++;
        col = 0;
    }
}

}

这是一张带有结果的图片:http: //i52.tinypic.com/2q903lk.png

viewWithTag似乎是最优雅的解决方案。所以我很茫然。知道为什么这些实现不呈现相同的吗?

4

2 回答 2

2

在我看来,你有一个背景UIImage来提供灰色渐变背景。看起来您的按钮的 a 也0可能[cell order]为 0。我猜您从未更改过 background 的标签,UIImage因此默认为 0。

当您调用[self viewWithTag]第一个UIButton(标记为 0)时,它会找到带有标签 0 的第一个子视图 - 背景图像,而不是UIButton您期望的 - 并移动它。这一点,我怀疑。这就是为什么所有其他按钮都排得很好,为什么背景移动奇怪,以及为什么你的 0 按钮不可见。

于 2011-01-11T17:10:39.183 回答
1

[self viewWithTag:0]首先返回self,而不是预期的(UIButton *),因为我没有tag在初始化时更改视图。显然,标签在初始化时默认为 0。layoutsubviews然后继续更改frameof self,弄乱了布局和功能。我通过在初始化时将视图的标签更改为 999 解决了这个难题。

于 2011-01-11T22:18:40.213 回答