自定义视图 - self.frame 不正确?

2023-11-21

所以我有一个自定义的 UIView 类

class MessageBox: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        createSubViews()
    }
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        createSubViews()
    }
    func createSubViews() {

        let testView = UIView(frame: self.frame)
        testView.backgroundColor = UIColor.brown
        self.addSubview(testView)
    }
}

我在故事板中添加了一个 UIView 并给了它一些约束:

距顶部100(超级视图),距左右各0,高度为180

但是当我运行应用程序时,我在代码中创建的棕色子视图太大了。我打印了self.frame在我的自定义视图中,事实证明框架是(0,0,1000,1000)。但为什么?我设置了约束,应该是这样的(0,0,deviceWith, 180).

enter image description here

我做错了什么?

编辑:这是我的故事板设置:

enter image description here


简短而简单的答案:

你这样做太早了。


详细解答:

当视图从 Interface Builder 文件(xib 或 Storyboard)初始化时,其框架最初设置为 Interface Builder 中的框架。您可以将其视为临时占位符。

当使用自动布局时,约束在视图的内部解决(=计算视图的实际框架)layoutSubviews() method.

因此,您的问题有两种可能的解决方案:

  1. (最好)如果您使用自动布局,请在整个视图中使用它。

    • 要么添加您的testView也在 Interface Builder 中并为其创建一个出口
    • 或创建您的testView像你一样在代码中,然后设置它的translatesAutoResizingMaskIntoConstraints财产给false(排序“激活自动布局”)并在代码中添加所需的约束。
  2. 设置你的testView之后的帧MessageBox视图的框架本身已由布局引擎设置。唯一可以确定系统已从约束中解析视图框架的地方是layoutSubviews()叫做。

    override func layoutSubviews() {
        super.layoutSubviews()
        testView.frame = self.frame
    }
    

    (您需要声明您的testView当然,作为属性/全局变量。)

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

自定义视图 - self.frame 不正确? 的相关文章

随机推荐

  • 重置提供商数据 - Flutter

    我在我的应用程序中使用多提供商 Provider 工作得很好 它存储数据 并且在任何事情发生变化时提供完美的事件 现在 我的应用程序中有这个场景 gt 用户 1 已登录 现在 当我在同一登录中添加第二个帐户 例如 Gmail 多帐户 时 提
  • Java 记录器 - 令牌的撇号问题

    我有一些无法解释的行为java util logging 让我们看一下这两个示例 First boolean var false log log Level WARNING Cant 0 new Object var output Cant
  • 如何将 int 转换为十六进制字符串?

    我想将一个整数 例如 我想通过65然后出去 x41 or 255并得到 xff 我尝试过这样做struct pack c 65 但是上面的任何东西都会窒息9因为它想要接受单个字符串 您正在寻找chr功能 您似乎混合了整数的十进制表示形式和整
  • 如果接收到有效负载大小为 0 的有效 TCP 数据包,recv() 将返回什么值

    在TCP套接字编程中 如果recv 返回0 表示对方关闭了连接 然而 据我所知 TCP RFC 并不强制要求 TCP 的有效负载 gt 0 因此 理论上 TCP 堆栈可以接收有效负载为 0 的消息 所以 本质上我的问题是recv 如果接收到
  • 无法在 Nuget 中将 Ninject 升级到最新版本

    我有一个 ASP NET WebForms 应用程序 它使用一些 Ninject 包 但我卡在某个版本上 当我尝试升级到最新版本时 出现 无法解决依赖项 问题 有问题的包是 Package InstalledVer LatestVer Ni
  • spring - 从类的静态字段中的属性文件中读取属性值

    我有一个实用程序类 其中有一种方法需要用户名和密码才能连接其他网址 我需要将该用户名保留在属性文件中 以便我可以随时更改它 但当我在静态方法 作为实用程序类 中使用它时 问题是它显示 null 即它无法从属性文件中读取 但是当我检查其他控制
  • bash 别名和 awk 引号转义

    我正在尝试为命令创建别名来查看内存使用情况 ps u user o rss command grep v peruser awk sum 1 END print sum 1024 但是 天真的人 bash aliases alias tot
  • boto3 file_upload 检查文件是否存在

    我正在查看 boto3 文档 但找不到它本身是否支持检查文件是否已存在于 s3 中 如果不存在 请不要尝试重新上传 这是我正在做的工作 import boto3 s3 client boto3 client s3 s3 bucket buc
  • Canvas DrawImage() 质量差[重复]

    这个问题在这里已经有答案了 我对 Html5 画布有疑问 i draw an image but its quality becomes very poor 当我用画布绘制它之后 它就变成了这样 我的代码在这里
  • 当对基元和装箱值使用 == 时,是完成自动装箱还是完成拆箱

    以下代码可编译 使用 Java 8 Integer i1 1000 int i2 1000 boolean compared i1 i2 但它有什么作用呢 Unbox i1 boolean compared i1 intvalue i2 o
  • Android套接字连接超时

    我的android应用程序通过socket连接到服务器 这是在node js中编码的 当在前台停留 15 分钟时 它会丢失与服务器的连接 以下是sockt连接服务器的代码 public void connect this connectio
  • 当我尝试从 bash 执行 python 脚本时权限被拒绝? [复制]

    这个问题在这里已经有答案了 我从网上下载了一个 python 脚本 当我尝试从 bash 执行它时 它抛出一个异常 User python script user python script py n some parameter b 输出
  • 如何使用 LibGit2Sharp 获取 Git 上的文件内容?

    我检查了代码BlobFixture cs并发现一些有关读取文件内容的测试 如下所示 using var repo new Repository BareTestRepoPath var blob repo Lookup
  • Handlebars 助手和 Ember Handlebars 助手有什么区别?

    我无法跟上对普通车把和修改后的 Ember 车把助手所做的所有更改 如果我没记错的话你可以用以下方法注册一个助手 Ember Handlebars helper Ember Handlebars registerHelper Ember H
  • Razor 和 HTML 帮助程序

    我正在尝试移植旧的 HTML Image 助手 我确信每个人都曾在某一时刻使用过它 但我遇到了问题 以下编译良好 Html Image my id Content my img png Alt Text 但是当我尝试在视图中使用它时 它只是
  • Java - 在程序中创建新的文件扩展名

    我的目标是为我正在创建的程序创建一个新的文件扩展名 可能不止一个 因此 在四处查看之后 我找到了一些有关该主题的资源 如下所列 以防万一有人想要查看它们并了解我一直在查看的内容 在 Java 应用程序中使用文件关联 创建注册表项以将文件扩展
  • 像表格排序器一样向 添加排序箭头

    我正在尝试向我的表格添加双箭头 向上和向下 例如表格排序器插件可以 这是我的fiddle 由于某种原因 jsfiddle 中甚至没有出现一个箭头 但它可以在我的原始表格上运行 我试过这个 table th addClass headerSo
  • 如何在uWSGI上仅记录5xx错误

    我想让uWSGI只记录服务器错误并避免正常的请求日志 因为文件增长得非常快 并且所有请求日志记录对我来说NGINX都很好 我怎样才能正确配置我的 uwsgi ini 呢 该文档对我来说不是很清楚 最后解决方案非常简单 logto var l
  • 如何在 Ruby 中将数字分组到不同的桶中

    我有一个文件 每行都有数字 0101 1010 1311 0101 1311 431 1010 431 420 我想要一个包含每个数字出现次数的哈希值 在本例中 0101 gt 2 1010 gt 2 1311 gt 2 431 gt 2
  • 自定义视图 - self.frame 不正确?

    所以我有一个自定义的 UIView 类 class MessageBox UIView override init frame CGRect super init frame frame createSubViews required in