UIView带来SubviewToFront:确实*不*将视图带到前面

时间:2012-04-04 20:57:54

标签: ios uiview uitouch

我正在实施一个简单的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顺序在拖动过程中保持不变。在下面的图片中,我拖着国王。请注意它在左图像中的九个顶部是正确的,但在右图像中的两个(实际上在整个堆栈下)不正确:

enter image description here enter image description here

我也试过改变layer.zPosition属性也无济于事。 如何在拖动过程中将卡片视图置于正面?我很神秘。

1 个答案:

答案 0 :(得分:8)

确认。 bringSubviewToFront:会导致layoutSubview被调用。由于我的layoutSubviews版本在所有视图上设置了z顺序,因此撤消了我在上面的touchesBegan:withEvent代码中设置的z顺序。 Apple应在bringSubviewToFront文档中提及此副作用。

我没有使用UIView子类,而是创建了一个名为CALayer的{​​{1}}子类。我在CardLayer子类中处理触摸,如下所示。 topZPosition是一个实例var,用于跟踪所有卡片的最高zPosition。请注意,修改KlondikeView通常是动画的 - 我在下面的代码中将其关闭:

zPosition