UIView BringSubviewToFront:*不*将视图带到前面

2024-03-29

我正在实现一个简单的 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财产也无济于事。 如何在拖动过程中将卡片视图置于最前面?我很困惑。


确认的。bringSubviewToFront: causes layoutSubview被调用。自从我的版本layoutSubviews在所有视图上设置 z 顺序,这会撤消我在中设置的 z 顺序touchesBegan:withEvent上面的代码。苹果应该在bringSubviewToFront文档。

而不是使用UIView子类,我创建了一个CALayer子类命名为CardLayer。我处理我的触摸KlondikeView子类如下所列。 topZPosition 是一个实例变量,用于跟踪所有卡的最高 zPosition。请注意,修改zPosition通常是动画的——我在下面的代码中将其关闭:

-(void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event {
   UITouch *touch = [touches anyObject];
   CGPoint touchPoint = [touch locationInView:self];
   CGPoint hitTestPoint = [self.layer convertPoint:touchPoint
                                           toLayer:self.layer.superlayer];
   CALayer *layer = [self.layer hitTest:hitTestPoint];

   if (layer == nil) return;

   if ([layer.name isEqual:@"card"]) {
     CardLayer *cardLayer = (CardLayer*) layer;
     Card *card = cardLayer.card;

     if ([self.solitaire isCardFaceUp:card]) {
        //...                                                                                                            
        [CATransaction begin]; // disable animation of z change                                                                  
        [CATransaction setValue:(id)kCFBooleanTrue
                         forKey:kCATransactionDisableActions];              
        cardLayer.zPosition = topZPosition++; // bring to highest z

        // ... if card fan, bring whole fan to top

        [CATransaction commit];
        //...                                                                                                            
     }
     // ...                                                                                                             
   }

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UIView BringSubviewToFront:*不*将视图带到前面 的相关文章

随机推荐

  • SQL Server 逆透视两列

    我正在尝试旋转表格以获得 3 列 我的示例表如下 CREATE TABLE tbl1 A1 int cA1 int A2 int cA2 int A3 int cA3 int GO INSERT INTO tbl1 VALUES 60 2
  • Wt C++ Web 框架的主机,部署问题

    我想知道 justhost com 是否足以托管 Wt C 网站 应用程序 它确实允许 FTP 和 SSH 访问http richelbilderbeek nl CppWtDeployGlobalHosted htm http richel
  • pyinstaller 是否有像 gcc -static 这样的参数?

    我有一个类似的问题 有没有办法将 Python 程序编译为二进制并将其与 Scratch Dockerfile 一起使用 https stackoverflow com questions 62581924 is there a way t
  • 在给定图上绘制水平线

    如何向现有绘图添加水平线 Use axhline https matplotlib org stable api as gen matplotlib pyplot axhline html 水平轴线 例如 这会在以下位置绘制一条水平线y 0
  • GUI 中的 __init__ 与 tkinter

    我正在学习使用 Tkinter 使用 python 创建简单的 GUI 我目前正在使用 python 文档作为参考 link http docs python org 2 library tkinter html 我想做的第一件事是理解那里
  • Spark:从 RDD[X] 生成所有可能组合的 RDD[(X, X)]

    Spark 中是否可以从 scala 集合中实现 combinations 函数 Iterates over combinations return An Iterator which traverses the possible n el
  • 矩阵/向量乘法顺序

    我在网上阅读了十几篇关于 OpenGL 中旋转 平移和缩放矩阵乘法的正确顺序的文章 然而 现在我开始自己实现它 我真的很困惑 假设在我的代码中我正在计算变换矩阵 并将其作为一个结果矩阵传递给着色器 shader SetUniform u M
  • 我可以使用 vue test utils 通过 ref 选择一个元素吗

    如果我有一张图片 img class pineapple src pineapple jpg 我可以使用 ref expect wrapper find refs pineapple exists toBe true 代替 expect w
  • 使用 iTextSharp 提取路径和形状

    iTextSharp 支持创建形状和路径PdfContentByte类 您可以在那里设置颜色并绘制曲线和基本元素 是否有一种机制可以以其他方式执行 我可以通过致电获取内容PdfReader GetPageContent 但我没有找到一个 解
  • 如何将数据帧行分组到pandas groupby列表中

    给定一个数据框 我想对第一列进行分组 并将第二列作为行中的列表获取 这样数据框如下 a b A 1 A 2 B 5 B 5 B 4 C 6 becomes A 1 2 B 5 5 4 C 6 我该怎么做呢 您可以使用以下方法执行此操作gro
  • 对顺序 SQL 记录进行分组

    寻找一种将连续时钟记录分组到单行中的方法 源系统具有身份列 员工 ID 日期和输入 输出标志 1 输入 2 输出 请注意 ID EmployeeID DATE InOut 1019374 5890 2008 08 19 14 07 14 1
  • 如何在 Pytube 中结合音频和视频?

    我正在尝试编写一段代码 在 Python 3 6 上使用 Pytube 下载 YouTube 视频 但对于大多数视频 渐进式下载 同一文件中的音频和视频 格式最多只能提供 360p 所以我想分别下载音频和视频文件 然后合并起来 我能够下载音
  • 在不更改值顺序的情况下对因子的级别进行重新排序

    我有包含一些数值变量和一些分类变量的数据框factor变量 这些因素的级别顺序不是我想要的方式 numbers lt 1 4 letters lt factor c a b c d df lt data frame numbers lett
  • 合并后,如何跟踪提交的来源?

    我的公司不维护存储库git 我们有效地使用 CVS 但为了我自己的理智 我在本地保留了一个存储库 过去 我想提出与以下相关的提交 bug report abcde 我可以通过 grep 查找提交消息bug report abcde并浏览它们
  • 将 apk 上传到市场时出现错误

    发生意外错误 请稍后再试 是我在 我尝试上传我签名的apk 完成应用程序后 我使用导出签名应用程序工具来生成密钥 为什么我会收到此错误 我发现只需退出并返回即可解决我的问题 使用火狐浏览器
  • 方向更改后未调用 Fragment 的 onActivityResult

    请注意 此问题与以下问题不重复 https stackoverflow com questions 19006776 onactivityresult not working with fragments https stackoverfl
  • Java:地图包含等于或小于另一个地图

    如何检查 1 个子集是否包含小于或等于另一个子集 下面是 SMap 和 TMap 在此示例中 执行方程式将返回 false sMap entrySet containsAll tMap entrySet 我相信它返回 false 因为它试图
  • 带有角度的人类可读日期的时间戳

    是否有内置的角度过滤器将我的unix时间戳转换为人类可读的日期格式 我已经尝试过以下方法 time date medium 但它给出了错误的结果 1232346882 gives Jan 15 1970 7 19 06 AM 我该如何解决这
  • 使用 MSBuild,如何通过迭代 ItemGroup 中的文件来构造动态字符串?

    我需要创建多个 testcontainer 参数以输入到执行 MsTest 的任务中 我有以下内容
  • UIView BringSubviewToFront:*不*将视图带到前面

    我正在实现一个简单的 iOS 纸牌游戏 允许用户以通常的方式拖动纸牌 这些卡片用UIView子类CardView 所有卡片视图都是兄弟视图 它们是子视图SolitaireView 以下代码片段尝试 将卡片置于前面 以便在拖动时它位于所有其他