草庐IT

ios - 为依赖于已解决内部布局的尺寸正确实现 intrinsicContentSize

coder 2023-07-27 原文

我有一个似乎有效的解决方案,但我想确保它是安全的并按预期使用该工具。我可以将我的问题归结为这种情况——我有一个包含多个垂直堆叠的 UILabel 的 UIView。每个标签都可以填充任意文本,这些文本可以垂直包装和扩展标签。在 View 中堆叠标签的自动布局约束是微不足道的。我想要做的是让 UIView 通过 intrinsicContentSize 将其首选高度( View 的高度应适合所有标签)传达给它的所有者。但是,在返回适当的高度之前,需要解决内部布局问题。我的理解是从[super layoutSubviews]返回后保证求解器完成,这就是我在做的:

- (void)layoutSubviews
{
    [super layoutSubviews];

    // solver's complete, now we can measure?
    [self invalidateIntrinsicContentSize];
}

我的intrinsicContentSize 实现引用最后一个标签的框架来计算高度。这一切似乎都适用于我目前的情况,但这让我很紧张。似乎求解器在布置其内部结构时要求当前 View 的 intrinsicContentSize。我不会详细介绍,但我遇到过这种模式进入无限循环的情况。我能够通过调整我的一些布局代码来解决这个问题 - 这并没有激发信心。

有更好的方法吗?这似乎是一件很常见的事情,当我开始解决这个问题时,我认为这就是 intrinsicContentSize 的用途。我所见过的 intrinsicContentSize 的实现一直都是微不足道的——维度的硬编码大小,或者测量不依赖于已解决的内部布局的单个 View 。

请注意,我不能只通过 NSString sizeWith... 方法来测量标签,因为内部布局太复杂了。

请注意,我探索了使用 systemLayoutSizeFittingSize:,但从 intrinsicContentSize 调用它会导致无限循环。

如有任何回应,我们将不胜感激!提前致谢!

最佳答案

我想更新这个线程并结束这个问题 - 我认为这里对于其他可能有类似误解的刚开始使用 AutoLayout 的人来说仍然有值(value)。了解 intrinsicContentSize 的真正目的很重要——这不是典型 View 将其首选大小传达给父 View 的方式。如果一个 View 使用 AutoLayout 对其 subview 进行布局,那么它将使用定义其内部布局的约束来通知其父 View 其大小——具体来说,它将是将 subview 与其父 View 相关联的约束,这将有助于定义 parent 的大小。这实际上是 AutoLayout 中既神奇又令人沮丧的部分 - 它是导致布局的所有这些约束( View 内部和外部)的总和。只有当您的 View 不使用 AutoLayout 来定义其大小(例如 UILabel 或 UIImageView 的经典情况)时,才真正需要固有大小。

我认为与多行文本相关的早期 iOS 错误/不一致导致我走上了 intrinsicContentSize 的道路。多行文本仍然不完美,但希望在 iOS10 中更好。

关于ios - 为依赖于已解决内部布局的尺寸正确实现 intrinsicContentSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19820475/

有关ios - 为依赖于已解决内部布局的尺寸正确实现 intrinsicContentSize的更多相关文章

  1. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  5. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  6. ruby - nanoc 和多种布局 - 2

    是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'

  7. 屏幕录制为什么没声音?检查这2项,轻松解决 - 2

    相信很多人在录制视频的时候都会遇到各种各样的问题,比如录制的视频没有声音。屏幕录制为什么没声音?今天小编就和大家分享一下如何录制音画同步视频的具体操作方法。如果你有录制的视频没有声音,你可以试试这个方法。 一、检查是否打开电脑系统声音相信很多小伙伴在录制视频后会发现录制的视频没有声音,屏幕录制为什么没声音?如果当时没有打开音频录制,则录制好的视频是没有声音的。因此,建议在录制前进行检查。屏幕上没有声音,很可能是因为你的电脑系统的声音被禁止了。您只需打开电脑系统的声音,即可录制音频和图画同步视频。操作方法:步骤1:点击电脑屏幕右下侧的“小喇叭”图案,在上方的选项中,选择“声音”。 步骤2:在“声

  8. 【高数】用拉格朗日中值定理解决极限问题 - 2

    首先回顾一下拉格朗日定理的内容:函数f(x)是在闭区间[a,b]上连续、开区间(a,b)上可导的函数,那么至少存在一个,使得:通过这个表达式我们可以知道,f(x)是函数的主体,a和b可以看作是主体函数f(x)中所取的两个值。那么可以有,  也就意味着我们可以用来替换 这种替换可以用在求某些多项式差的极限中。方法: 外层函数f(x)是一致的,并且h(x)和g(x)是等价无穷小。此时,利用拉格朗日定理,将原式替换为 ,再进行求解,往往会省去复合函数求极限的很多麻烦。使用要注意:1.要先找到主体函数f(x),即外层函数必须相同。2.f(x)找到后,复合部分是等价无穷小。3.要满足作差的形式。如果是加

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐