我正在尝试模仿拼图游戏的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;
}
}
似乎是最优雅的解决方案。所以我很茫然。知道为什么这些实现不会呈现相同的内容吗?
答案 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来解决了这个难题。