iOS 上 UIVIew 和 CALayer 关于背景图片的关系

2023-12-27

试图理解UIView和CALayer之间的关系。我阅读了Apple文档,但它没有详细描述两者之间的关系。

  1. 为什么当我添加背景图像来查看“自定义 ViewController.view”时,我会得到不需要的图像黑色。

  2. 当我将背景图像添加到“customViewController.view.layer”层时,图像的黑色区域消失了(这就是我想要的),但背景图像被颠倒了。这是为什么?

  3. 如果我要添加标签/视图/按钮/等。对于视图,图层的背景图像是否会遮挡它们,因为 CAlayer 是由 UIView 支持的?

  4. 当您设置 UIView 的背景颜色时,它是否会自动设置关联图层的背景颜色?

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        customViewController = [[CustomViewController alloc] init];
        customViewController.view.frame = CGRectMake(213, 300, 355, 315);
    
        customViewController.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]];
        //  customViewController.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]].CGColor;
    
        [self.view addSubview:customViewController.view];
    }
    

视图中的背景图片:

- (void)viewDidLoad
{
    [super viewDidLoad];
    customViewController = [[CustomViewController alloc] init];
    customViewController.view.frame = CGRectMake(213, 300, 355, 315);

//  customViewController.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]];
    customViewController.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]].CGColor;

    [self.view addSubview:customViewController.view];
}

view.layer中的背景图片:


  1. UIView 默认创建为不透明。当您将backgroundColor 设置为具有透明度的图案时,它会选择黑色作为背景色。您可以设置customViewController.view.opaque = NO;让您身后的景色的背景显现出来。

  2. 当您将图层的背景颜色设置为具有透明度的图案时,您将绕过 UIView 逻辑,因此视图的不透明性将被忽略; UIView 的变换也是如此。 CoreGraphics 和朋友使用正 y 轴指向上方的坐标系。 UIKit 翻转这个坐标系。这就是图像看起来颠倒的原因。

  3. 如果您添加标签/视图/按钮/等。将正确显示在图层背景图案的顶部。

  4. 当您设置视图的背景颜色时,看起来就像确实设置了图层的背景颜色一样。 (我没有在任何地方看到过这个记录)。

本质上,UIKit 的 UIView 东西是一个高级界面,最终渲染到层上。

希望这可以帮助。

编辑 2011 年 5 月 7 日

您可以通过翻转图层的坐标系来使图像以正确的方式显示,但您不应该对 view.layer 执行此操作; UIKit 不希望你弄乱这个层,所以如果你翻转它的坐标系,任何 UIKit 绘图都会被翻转;你需要使用一个子层。

所以你的代码看起来像这样:

- (void)viewDidLoad
{
    [super viewDidLoad];
    customViewController = [[CustomViewController alloc] init];
    customViewController.view.frame = CGRectMake(213, 300, 355, 315);

    CALayer* l = [CALayer layer];
    l.frame = customViewController.bounds;
    CGAffineTransform t = CGAffineTransformMake(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
    l.affineTransform = t;
    l.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage
                             imageNamed:@"login_background.png"]].CGColor;
    [customViewController.view.layer addSublayer:l];

    [self.view addSubview:customViewController.view];
}

注意:通常,当您翻转坐标时,您会包含高度。对于图层,您不需要这样做。我还没有深究为什么会这样。

正如您所看到的,这里涉及更多的代码,而且这样做并没有真正的优势。我强烈建议您坚持使用 UIKit 方法。我发布代码只是为了满足您的好奇心。

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

iOS 上 UIVIew 和 CALayer 关于背景图片的关系 的相关文章

随机推荐

  • Android MediaCodec:多个 SurfaceView 支持多少个同步(视频)解码线程?

    From Grafika https github com google grafika项目 文件 DoubleDecodeActivity java 我在 3 个 SurfaceView 上使用 MediaCodec API 尝试了 3
  • 带有 poco 生成的实体框架 IQueryable

    我创建了一个 T4 模板 它生成标准实体类及其每个属性的接口 以便我可以制作仅包含我想要的数据的自定义 poco 对象 我还创建了一个复制函数 它可以在实现所述实体接口的任何对象之间进行转换 生成的代码如下所示
  • 如何在 Apple 的 TestFlight 服务上重新发送外部测试人员邀请 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • macOS + Qt + Intellisense 上的 Visual Studio Code

    Visual Studio Code 出现以下错误 cannot open source file QtWidgets qtwidgetsglobal h dependency of QApplication C C 1696 我有一个 C
  • CALayer 的动画结束回调?

    我想知道 CALayer 中动画的回调在哪里 或者是否有任何东西 具体来说 对于隐式动画 例如更改框架 位置等 在 UIView 中 您可以执行以下操作 UIView beginAnimations SlideOut context nil
  • ng-bootstrap 模式不显示

    我在我的应用程序中使用 ng bootstrap 模式来显示对话框 但是当单击按钮时 什么也没有发生 模式没有显示 在调试时 它可能会发现该操作被调用 但模式未显示 这是我的 app module ts import NgModule fr
  • Vaadin Binder 中的上传组件,例如粗略编辑器

    我有一个 Crud 来自 Vaadin Pro 并且想使用 BinderCrudEditor 中的上传组件 Upload 组件不存储值 或者更确切地说 缺少 HasValue 接口 因此我无法使用 Binder 有没有什么方法可以以某种方式
  • persp() 轴标签中的下标

    我正在尝试使用以下函数绘制两个变量的函数persp R 中的函数 这是我到目前为止所拥有的 C unab lt function u1 u2 return u1 u2 x lt seq 0 1 by 0 1 y lt seq 0 1 by
  • 同时绘制 3D 平面和点

    我正在尝试使用 Matplotlib 同时绘制一个平面和 3D 中的一些点 我没有错误 只是点不会出现 我可以在不同时间绘制一些点和平面 但不能同时绘制 代码部分如下所示 import numpy as np import matplotl
  • 尝试在 Android Studio 上运行增强

    我正在尝试在 Android Studio 中设置 jdo jpa 并遵循上一个问题的答案here https stackoverflow com questions 23303893 google apps engine backend
  • 接口实现(接口隔离原则)

    我遇到一种情况 我需要调用第三方服务来获取一些信息 这些服务对于不同的客户可能会有所不同 我的界面中有一个身份验证功能 如下所示 interface IServiceProvider bool Authenticate string use
  • LinqPad 不使用 C# 语句返回结果

    已经很晚了 所以这一定是愚蠢的事情 我已将 LinqPad 连接到我的数据库 但似乎无法获得最简单查询的结果 var q from app in AppInstances select new AppId app AppId 当我运行它时
  • 在视图中获取 Laravel 5 控制器名称

    我们旧网站 CSS 的设置是为了body标签有一个控制器名称的 id 和一个动作名称的类 使用 Zend Framework 1 现在我们切换到 Laravel 5 我找到了一种通过Route类 但找不到控制器名称的方法 我在 Larave
  • 通过字符串在对象图中查找属性

    我正在尝试使用访问嵌套类结构的各个部分随意的细绳 给定以下 人为的 类 public class Person public Address PersonsAddress get set public class Adddress publ
  • SQL Server 查询超时

    访问 SQL Server 2012 数据库的第 3 方应用程序正在获取 Microsoft ODBC SQL Server Driver Query timeout expired执行大约20分钟后出现错误 这是应用程序开始接收错误后我在
  • Php 标头位置重定向不起作用

    不知道为什么这不起作用 这是代码 if isset POST cancel POST cancel cancel header Location page1 php echo POST cancel 此输出不是重定向页面 而是cancel到
  • java.lang.RuntimeException: CronExpression '4 27 11 ? 8? 2014' 无效,

    将此作为无效的 CronExpression 无法弄清楚为什么 转介http www quartz scheduler org documentation quartz 1 x tutorials crontrigger http www
  • 将类型参数约束为基类型

    我知道如何强制类型参数成为subtype另一种类型 public interface IMapping
  • Zend Zend_File_Transfer_Adapter_Http重命名问题

    我有一个关于在 Zend 中上传文件后重命名文件的问题 我不知道将重命名过滤器放在哪里 这就是我所拥有的 我尝试过移动东西 但我迷路了 目前 它确实将文件上传到我的照片文件夹 但没有重命名 谢谢你的帮助 if this gt request
  • iOS 上 UIVIew 和 CALayer 关于背景图片的关系

    试图理解UIView和CALayer之间的关系 我阅读了Apple文档 但它没有详细描述两者之间的关系 为什么当我添加背景图像来查看 自定义 ViewController view 时 我会得到不需要的图像黑色 当我将背景图像添加到 cus