我正在实施一个简单的iOS纸牌游戏,允许用户以通常的方式拖动卡片。卡片用UIView
子类CardView
表示。所有卡片视图都是兄弟姐妹,它们是SolitaireView
的子视图。以下代码片段尝试“将卡片放在前面”,以便在拖动时它位于所有其他视图之上:
-(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
属性也无济于事。
如何在拖动过程中将卡片视图置于正面?我很神秘。
答案 0 :(得分:8)
确认。 bringSubviewToFront:
会导致layoutSubview
被调用。由于我的layoutSubviews
版本在所有视图上设置了z顺序,因此撤消了我在上面的touchesBegan:withEvent
代码中设置的z顺序。 Apple应在bringSubviewToFront
文档中提及此副作用。
我没有使用UIView
子类,而是创建了一个名为CALayer
的{{1}}子类。我在CardLayer
子类中处理触摸,如下所示。 topZPosition是一个实例var,用于跟踪所有卡片的最高zPosition。请注意,修改KlondikeView
通常是动画的 - 我在下面的代码中将其关闭:
zPosition