子视图的子层与更高的子视图重叠

2024-05-13

我有一个问题:我正在创建一个UIView这是从方法返回的,这部分很好,但我注意到,当我将子层添加到其中一个子视图时,这些层与子层添加的层次结构中较高的子视图(textView 和 imageView)重叠到testViewCopy出现在这些子视图之上,但它们不应该出现。我不知道这里发生了什么导致这种情况。

Code:

- (void)makeShareImages
{
    UIView *shareView = [self shareView];

    UIView *testViewCopy = [shareView viewWithTag:0];

    NSUInteger currentIndex = 1;

    for (NSDictionary *sub in self.array)
    {
        NSArray *lastArray = [sub objectForKey:@"LastArray"];

        for (NSDictionary *dict in lastArray)
        {
            @autoreleasepool
            {
                currentIndex ++;

                CircleLayer *layer = [[CircleLayer alloc]init];
                layer.portrait = [[dict objectForKey:@"Portrait"]boolValue];

                layer.frame = testViewCopy.bounds;

                [testViewCopy.layer addSublayer:layer];

                NSData *frameData = [self getSnapshotDataFromView:shareView];

                NSString *savePath = [NSString stringWithFormat:@"%@/%lu.png",somePath,(unsigned long)currentIndex];

                [frameData writeToFile:savePath options:0 error:nil];
            }
        }
    }
}

- (UIView *)shareView
{
    UIColor *bgColor = self.containerView.backgroundColor;

    CGSize size = self.containerView.bounds.size;

    UIView *viewToShare = [[UIView alloc]init];
    viewToShare.backgroundColor = bgColor;
    viewToShare.layer.cornerRadius = 6.0;
    viewToShare.layer.masksToBounds = YES;

    UIView *testViewCopy = [[UIView alloc]init];
    testViewCopy.backgroundColor = [UIColor clearColor];
    testViewCopy.contentMode = UIViewContentModeScaleAspectFit;
    testViewCopy.layer.masksToBounds = YES;
    testViewCopy.tag = 0;

    UITextView *textViewCopy = [[UITextView alloc]init];
    textViewCopy.backgroundColor = [UIColor clearColor];
    textViewCopy.tag = 1;
    textViewCopy.textContainerInset = self.textView.textContainerInset;

    UIImageView *profileImageViewCopy = [[UIImageView alloc]initWithFrame:CGRectMake(2, 2, 32, 32)];
    profileImageViewCopy.contentMode = UIViewContentModeScaleAspectFit;
    profileImageViewCopy.layer.masksToBounds = YES;
    profileImageViewCopy.image = [self profileImage];
    profileImageViewCopy.tag = 2;
    profileImageViewCopy.layer.cornerRadius = profileImageViewCopy.frame.size.width / 2.0;

    viewToShare.frame = CGRectMake(0, 0, size.width, size.height);
    testViewCopy.frame = CGRectMake(0, 0, size.width, size.width);
    textViewCopy.frame = CGRectMake(0, 0, size.width, size.height);

    NSAttributedString *attributedStringCopy = [[NSAttributedString alloc]initWithAttributedString:self.textView.attributedText];

    textViewCopy.attributedText = attributedStringCopy;

    [viewToShare addSubview:testViewCopy];
    [viewToShare addSubview:textViewCopy];
    [viewToShare addSubview:profileImageViewCopy];

    return viewToShare;
}

- (NSData *)getSnapshotDataFromView:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, NO, 0.0);
    [view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *snapShot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return UIImagePNGRepresentation(snapShot);
}

您的代码行为正确。所有同级视图(公共超级视图的子视图)都有明确的分层顺序,从后到前。addSubview:将子视图添加为last在它的兄弟姐妹中;因此,它位于同一超级视图的所有现有子视图的前面。如果这不是您想要的,请将子视图插入到距离前面更远的一层,或者添加它(在前面),然后将其按分层顺序向后移动。

此外(在这里我认为我们越来越接近您注意到的特定现象),视图本身只是层。因此,视图的分层顺序实际上是层的分层顺序的子集。我刚才所说的关于视图的同样的事情也同样适用于图层,因为视图are层:如果将子层添加到超级层,它将添加到该超级层的所有其他子层之前,包括任何子视图如果该超级层实际上是一个视图。

正如我在当前版本的书中所写:

视图的子视图的底层是该视图底层的子层,就像该视图底层的任何其他子层一样。因此,它可以按绘图顺序放置在其中的任何位置。视图可以散布在其父视图底层的子层中这一事实令初学者感到惊讶。

听起来你刚刚发现了这一点,并且感到相当惊讶。

从渲染树的绘制角度来思考它可能会有所帮助。换句话说,不要去思考事情是如何发生的look,想想iOS是什么does。一个层可以有一个超级层,除了最终超级层之外,一个层可以有一个先前的兄弟层,除了超级层的第一个子层。相反,一个层可以有子层,并且可以有下一个兄弟层。我们首先绘制最终的超级层(窗口)。然后,对于我们刚刚绘制的每一层,按顺序遵循以下两个规则:

  • 绘制其第一个子层(如果有)。

  • 画出它的下一个兄弟姐妹(如果有的话)。

每次我们绘制一个图层时,它都在前面一切我们之前已经画过。因此,超级层的所有子层都出现在超级层的前面,并且所有后面的兄弟层(及其子层)出现在所有先前兄弟层(及其子层)的前面。这会导致您在屏幕上看到的结果。

(但是,请注意,您具有更大的灵活性,因为在兄弟姐妹中,您可以通过设置zPosition层的属性。)

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

子视图的子层与更高的子视图重叠 的相关文章

随机推荐

  • 如何从分组数据创建直方图

    我正在尝试根据 pandas 中的分组数据创建直方图 到目前为止 我已经能够创建标准线图 但我不知道如何做同样的事情来获取直方图 条形图 我想获得泰坦尼克号事故中幸存者和未幸存者的 2 个年龄直方图 看看年龄分布是否存在差异 来源数据 ht
  • JavaScript - 类根据条件扩展

    事情是这样的 我有一个名为 A 的主课 我希望这个班级能够扩展 B 级 class A extends B 但事实上 我希望 B 类在特定条件下扩展 C D 或 E class B extends B1 or class B extends
  • Laravel 中的支付网关回调时会话会自动销毁

    我正在尝试将 CCavenue com 支付网关集成到我的 Laravel 7 项目中 我面临的唯一问题是在回调 url 中 从支付网关获取发布数据后 活动会话会自动销毁 我还向中间件添加了 CSRF 例外 PayController 生成
  • python 没有名为serial的模块

    我的 python 程序有问题 我编写了程序来将数据 温度 从 arduino 获取到我的树莓派 sqlite 数据库 但它在第 4 行 导入串行 处给了我一个错误 提示 ImportError 没有名为串行的模块 我使用 python3
  • 从 HList 获取元素

    我尝试了 HList 并按预期进行了以下工作 val hl 1 foo HNil val i Int hl 0 val s String hl 1 但是 我无法让以下代码正常工作 让我们暂时假设对列表进行随机访问是一个聪明的主意 class
  • 如何在 PuTTY 中保存并运行 Java 文件?

    我是 AWS 亚马逊网络服务 的新手 所以这可能是一个基本问题 我在 AWS 上创建了一个 EC2 实例 我有一台 Windows 计算机 因此我使用 PUTTY 来连接 Linux 实例 连接到我的 EC2 实例后 我使用以下命令编写 J
  • 如何比较两个对象数组并更改两个数组中找到的对象的值?

    假设我有两个对象数组 let array1 id 1 name snow id 4 name jo id 8 name bran id 12 name gondo id 13 name peter
  • 有没有办法获取 PHP 中可用区域设置的列表?

    在Java中 你可以调用Locale getAvailableLocales 获取可用区域设置的列表 我期待 PHP 的同等功能Locale http php net manual en class locale php类 但找不到 有没有
  • 如何对主索引重新编号

    我有一个简单的 MySQL 表 主索引 id 不是一一编号的 1 31 35 100 等 我希望它们的编号如 1 2 3 4 请告诉我该怎么做 我还想指出的是 我知道该操作可能产生的后果 但我只是想整理一下表格 我同意其他方法也可以 但我只
  • UITableView 无法一直滚动到底部[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我只是好奇 我做了一些UITable
  • Bootstrap 3 在移动设备上滑入菜单/导航栏 [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我正在构建一个基于浏览器的移动应用程序 我决定使用 Bootstrap 3 作为设计的 CSS 框架 Bootstrap
  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 当 Android 上的脸部靠近屏幕时,以编程方式关闭屏幕

    我的应用程序是一个拨号器 当用户将手机靠近头部时 我需要关闭屏幕并防止单击控件 就像本机 Android 拨号器行为一样 我需要什么 API 级别以及如何以正确的方式做到这一点 我通过反汇编一个非常著名的 VoIP 应用程序找到了解决方案
  • 我们如何在odoo中继承BaseModel类

    需要继承BaseModel类并添加一个新属性 例如 auto True register False name None columns constraints custom False defaults rec name None par
  • 计算网页内的字数

    我需要使用 python3 计算网页内的单词数 我应该使用哪个模块 网址库 这是我的代码 def web f urllib request urlopen https americancivilwar com north lincoln h
  • 如何在不加载关联模型的情况下检查 has_one 是否存在

    我有一个简单的 has one 关系 class User lt ApplicationRecord has one detail has many courses end class Detail lt ApplicationRecord
  • 无法删除临时文件夹(有时)

    当我启动应用程序时 我创建一个临时文件夹 public static File createTempDir String name throws IOException File tempDir File createTempFile na
  • 使用 getopt_long (C++) 如何为两个需要参数编写长选项和短选项?

    include
  • 有人知道 Drupal 7 的分面搜索解决方案吗?

    分面搜索模块不会被移动到 Drupal 7 我有什么选择 The 搜索API模块 http drupal org project search api是 Drupal 7 的新增功能 允许您从各种后端中进行选择 包括Solr http dr
  • 子视图的子层与更高的子视图重叠

    我有一个问题 我正在创建一个UIView这是从方法返回的 这部分很好 但我注意到 当我将子层添加到其中一个子视图时 这些层与子层添加的层次结构中较高的子视图 textView 和 imageView 重叠到testViewCopy出现在这些