使用layoutsubviews()在通过UIButtons循环时可以正常工作,但在循环时通过标记检索时不能正常工作

时间:2011-01-11 16:13:54

标签: iphone objective-c cocoa-touch ios4 layoutsubviews

我正在尝试模仿拼图游戏的iPhone Springboard拖放功能,目前正在使用MatrixCells在View initalisation中生成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;
    }
}

}

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。但是,布局在按钮0处混乱,我不能再将它们用作按钮了。

frame

- (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

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; } } 似乎是最优雅的解决方案。所以我很茫然。知道为什么这些实现不会呈现相同的内容吗?

2 个答案:

答案 0 :(得分:2)

在我看来,您更喜欢有背景UIImage来提供灰色渐变背景。看起来您的按钮0的{​​{1}}可能为0.我猜您从未更改过背景[cell order]的标记,因此默认为0

当您为第一个UIImage(标记为0)致电[self viewWithTag]时,它会找到第一个带有标记0的子视图 - 背景图片,而不是您预期的UIButton - 以及移动那个。我怀疑这一点。这就是为什么所有其他按钮排列正常,为什么背景奇怪地移动,以及为什么你的0按钮不可见。

答案 1 :(得分:1)

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