【发布时间】:2012-04-04 20:57:53
【问题描述】:
我正在实现一个简单的 iOS 纸牌游戏,它允许用户以通常的方式拖动卡片。卡片用UIView 子类CardView 表示。所有卡片视图都是兄弟姐妹,它们是SolitaireView 的子视图。以下 sn-p 尝试“将卡片放在前面”,以便在拖动时它高于所有其他视图:
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
UITouch *touch = [touches anyObject];
if (touch.view.tag == CARD_TAG) {
CardView *cardView = (CardView*) touch.view;
...
[self bringSubviewToFront:cardView];
...
}
}
很遗憾,卡片的 z 顺序在拖动过程中保持不变。在下面的图片中,我正在拖动国王。注意它是如何正确地位于左图中的九之上,但不正确地位于右图中的二之下(实际上是在整个堆栈之下):
我也尝试更改 layer.zPosition 属性也无济于事。
如何在拖动过程中将卡片视图置于前面?我很困惑。
【问题讨论】:
-
我发现
bringSubviewToFront:触发了要设置视图的“needsLayout”标志。我的layoutSubviews方法也调用了bringSubviewToFront:从而将所有视图 z 顺序恢复到初始状态! -
那有什么解决办法呢?我也有同样的要求,从卡片列表中,如果我选择任何中间顺序卡片,它应该出现,然后来到前面。但我的动画由于bringSubviewToFront: 方法而无法正常工作
-
如果您坚持使用 UIView 子类,那么您需要标记正在拖动的卡片,以便 layoutSubviews 可以将其放在顶部。我实际上改用了下面提到的 CALayers。
-
感谢您的回复。你能把代码放上去吗?
-
下面列出了一个代码sn-p。