问题标签 [intrinsic-content-size]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
54686 浏览

ios - 如何在 Swift 中设置自定义视图的内在内容大小?

背景

我正在制作一个垂直标签以与传统的蒙古文字一起使用。在我只是旋转 a 之前,UILabel但存在一些性能问题和其他并发症。现在我正在从头开始制作标签。但是,我需要垂直标签在其高度调整时告诉自动布局(基于字符串长度)。

我读过的

我阅读了Intrinsic Content SizeViews with Intrinsic Content Size文档。不过,这些更多的是关于如何使用它,而不是如何在自定义视图中定义它。

搜索“自定义视图的 ios 内在内容大小”只会给我

在堆栈溢出中。这个特定的问题甚至不需要内在的内容大小,因为他们的视图只是标准视图的集合。

我正在尝试什么

我正在尝试的是我在下面的答案。我正在添加这个问答对,这样其他人就不会像我使用我使用的搜索关键字那样花很长时间才能找到答案。

0 投票
1 回答
3325 浏览

ios - 如何使自定义视图的框架与其内在内容大小相匹配

根据内容调整大小的自定义标签

我正在从头开始制作标签。(我的最终目的是为蒙古文字制作一个垂直文本标签,但现在我只是制作一个普通的水平文本标签作为练习。)

只要没有长度和宽度限制,我希望自定义标签的框架根据其内在内容大小调整大小。

它适用于 IB

UILabel在 IB 中,当我测试 a 、我的自定义标签(一个UIView子类)和一个按钮时,一切似乎都运行良好。

我为每个视图添加了顶部和前导约束,但没有设置任何高度或宽度约束。

在此处输入图像描述

如果我在情节提要上调整它们的大小(但仍然没有添加任何约束)......

在此处输入图像描述

然后选择Update Frames for All Views in View Controller,普通标签和我的自定义标签都正确调整为它们固有的内容大小。

在此处输入图像描述

它不适用于正在运行的应用程序

但是,当我在运行时更改标签文本时,我的自定义标签的框架没有调整大小。(我暂时在文本图层中添加了深蓝色边框,以帮助将其与自定义标签的框架区分开来,即浅蓝色背景色。)

在此处输入图像描述

单击“更改文本”给出

在此处输入图像描述

如您所见,文本层框架发生了变化,但自定义视图的框架没有。

代码

这是我的自定义标签类:

这是视图控制器类:

问题

UILabel我的自定义标签中缺少什么?我覆盖了intrinsicContentSize

我还需要做什么?

0 投票
2 回答
14860 浏览

html - 如何在加载之前保持图像大小内在,以便布局稳定?

我一直认为你可以指定一个<img/>'swidthheight属性,这样浏览器就知道它的物理尺寸,而不必先下载(至少是标题)。但显然这些属性被视为 CSS 属性 - 因此当您尝试执行类似width: 50%; height: auto. 然后,直到下载图像,计算的高度保持为 0
有没有办法通过 HTML/CSS 显式设置图像的物理尺寸(实际上是其纵横比)?

(......并避免在使用 Masonry 时出现“未知纵横比的闪烁”/大量紧张的重新布局 - 你也许可以解决这个问题,但我对基本问题更感兴趣。即使我正在努力询问简而言之:)

0 投票
0 回答
655 浏览

ios - 启用 UITableViewAutomaticDimension 的 UITableView 单元格中的自定义 UIView

我有UITableViewUITableViewAutomaticDimension一些estimatedRowHeight。对于这个表,我使用了 custom UITableViewCell,其中包含一些 label 和 customUIView并覆盖了intrinsicContentSize()。约束设置正确,表格能够确定每行的实际高度。到目前为止,一切都很好。

现在我开始修改我的自定义视图的内部逻辑,以根据可用宽度调整它的外观,即当表格单元格大小不够宽时,我的视图可以重新排列子视图以适应新的限制,这会对结果高度产生影响,所以我有类似的代码那:

现在,当我填充表格视图时,intrinsicContentSize()返回一些所需的值,但它不适合当前布局,然后控制转到layoutSubviews()重新计算大小并再次调用系统的位置intrinsicContentSize(),现在它返回了良好的值。但是,第一个时间表会加载基于错误intrinsicContentSize()值计算的数据和像元高度。如果我reloadData()再次调用一切都会变得很好,并且表格中所有即将出现的单元格的布局也可以。

我的错误在哪里以及如何修改代码以使单元格大小正常工作而无需调用reloadData()两次?

0 投票
7 回答
7524 浏览

ios - UIScrollView that expands with contents' instrinsic size until height X, and then scrolls

I'm basically trying to reproduce the behavior of the title and message section of an alert.

enter image description here

The title and message labels appear to be in a scroll view. If the label text increases then the alert height also increases along with the intrinsic content size of the labels. But at a certain height, the alert height stops increasing and the title and message text become scrollable.

What I have read:

Articles

Stack Overflow

The answer may be in there but I was not able to abstract it.

What I have tried:

Only focusing on the scroll view with the two labels I tried to make a minimal example in which a parent view would resize according to the intrinsic height of the scrollview. I've played around with a lot of constraints. Here is one combo (among many) that doesn't work:

enter image description here

I've worked with auto layout and normal constraints and even intrinsic content sizes. Also, I do know how to get a basic scroll view working with auto layout. However, I've never done anything with priorities and content hugging and compression resistance. From the reading I've done, I have a superficial understanding of their meanings, but I am at a loss of how to apply them in this instance. My guess is I need to do something with content hugging and priorities.

0 投票
1 回答
137 浏览

css - CSS:单个元素的内在比率(填充黑客)意外行为

我对填充比率黑客有点困惑。

它与一个额外的容器一起工作,但如果我简化标记,它的行为方式就不一样了。(高度不同)

0 投票
0 回答
541 浏览

ios - 自定义 UINavigationBar - 动画内在高度变化

在这种特殊情况下,我实际上很困惑。我对 UINavigationBar 进行了子类化,注意到 Apple 过时的示例代码,意识到 sizeToFit 永远不会被调用和覆盖intrinsicContentSizelayoutSubviews计算必要的高度。在根据我提供的自定义视图计算高度时,一切都很好(我systemLayoutSizeFittingSize用于根据自定义内容视图/标题视图动态计算高度)。

奇怪的是,当我尝试为任何更改设置动画时,我可以为 custom 中的更改设置动画titleView,但是当通过 重新加载intrinsicContentSize 时invalidateIntrinsicContentSize(),视图框架更改不会设置动画。它啪啪啪。

示例代码:

一个约束值更改将动画化,但不幸的是(因为 navBars 不依赖自动布局)似乎更新框架存在问题。我尝试在使固有大小无效之前直接更新框架,但没有成功。我还尝试了高度约束,将其列在具有不同时间偏移的关键帧动画中,在不同的时间点使布局无效,但都没有成功。任何帮助将不胜感激。

可以在这里找到调整大小的代码:

0 投票
1 回答
14830 浏览

ios - 如何:使用 iOS 中的 StackView 视图从 XIB 中自定义大小的自定义视图

我最近再次开始使用 Swift 进行 iOS 开发,现在正在研究自定义 UIControl。为了布局和灵活性,这个自定义视图是使用 StackView 构建的。

我想要达到的...

... 基本上是简单地与 StackView 具有相同的功能,我通常将它直接拖到情节提要中时 - 它调整大小以适应没有问题。这与自调整大小的 tableview 单元格基本相同。

展示柜

我可以将我的 CustomView 简化为一个简单的示例:它是一个 StackView,其中包含三个标签,Alignment设置为Center, Distribution Equal Centering。StackView 将固定到左、右和顶部布局指南(或尾随、前导和顶部)。我可以使用从 XIB 加载的 CustomView 轻松地重新创建它,并将其转换为具有相同参数的 CustomView - 我将两者都附加为屏幕截图。

简单 StackView 的截图

自定义视图的屏幕截图

加载 XIB 文件并进行设置。

您可以在这里看到的是,我只是加载了 XIB 文件,覆盖布局子视图以使框架适应实际视图,仅此而已。

问题

所以我的问题与通常如何处理有关。我的 StackView 中的标签具有内在的内容大小,即通常 StackView 只是适应标签的高度而不会抱怨 - 如果您在情节提要中设计它。但是,如果您将所有这些都放在 XIB 中并保持布局不变,则不会 - 如果视图以三种方式固定在屏幕截图中(顶部、前导、尾随),则 IB 会抱怨未知高度。

我阅读了 Auto-Layout Guide 并观看了 WWDC 视频“AutoLayout 的奥秘”,但这个话题对我来说还是很新的,我认为我还没有找到正确的方法。所以这是我需要帮助的地方

(1) 我应该设置约束并禁用translatesAutoresizingMaskIntoConstraints吗?

我首先可以并且应该做的是设置 translatesAutoresizingMaskIntoConstraints false这样我不会得到自动生成的约束并定义我自己的约束。所以我可以loadNib变成这样:

基本上,我确实拉伸了视图以适应 Storyboard 中 UIView 的整个宽度,并限制了它的顶部和底部到 StackView 的顶部和底部。

我在使用这个时遇到了很多 XCode 8 崩溃的问题,所以我不太确定该怎么做。

(2) 还是我应该覆盖intrinsicContentSize

我也可以intrinsicContentSize通过检查所有我的高度来简单地覆盖arrangedSubviews并取最高的那个,将我的视图高度设置为它:

虽然这肯定给了我更大的灵活性,但我还必须使内在内容大小无效,检查动态类型和许多其他我宁愿避免的东西。

(3)我什至以“建议”的方式加载 XIB 吗?

还是有更好的方法,例如使用UINib.instantiate? 我真的找不到最佳实践方法来做到这一点。

(4) 为什么我必须首先这样做?

真的,为什么?我只是将 StackView 移到了 CustomView 中。那么为什么StackView现在就停止自适应了,为什么还要设置上下约束呢?

到目前为止,帮助最大的是https://stackoverflow.com/a/24441368中的关键短语:

“一般来说,自动布局是以自上而下的方式执行的。换句话说,首先执行父视图布局,然后执行任何子视图布局。”

..但我真的不太确定。

(5) 为什么我必须在代码中添加约束?

假设我禁用translatesAutoresizingMaskIntoConstraints了,那么我不能为 IB 中的 tableview 单元格设置约束?它总是会转换为 label.top = top 之类的东西,因此标签会被拉伸,而不是 StackView 继承大小/高度。此外,对于 XIB 文件,我也无法真正将 StackView 固定到 IB 中的容器视图。

希望有人可以帮助我。干杯!

0 投票
2 回答
114 浏览

ios - 使用自动布局将 3 个按钮与目标 C 中的动态内容对齐

我有 3 个按钮,一个在另一个下方。要求是,所有按钮都应该居中对齐。动态内容应该适合这 3 个按钮。请帮我解决这个问题。我对内容拥抱,抗压缩性和内在内容大小只有模糊的了解。非常感谢您。

0 投票
2 回答
1225 浏览

ios - Collapse view if can't fit it's intrinsic size in AutoLayout

I have UILabel and UIButton inside view which can have different size, and I want label to be hidden completely if it can't fit all the content within current frame using only AutoLayout. So basically I want it to follow it's intrinsic size, and if it shrink, it should shrink straight to zero without any middle width. Desired example:

example non-collapsed desired collapsed view

Instead, I'm having it shrinking and trying to display as much as possible:

enter image description here

Is it possible to do only using AutoLayout? If not, why?

I tried to add zero-width constraint on label and set it's priority to be less than compression resistance of the label, but this does not work. I thought that once Autolayout engine broke intristic size rule, mine zero-width will be followed, but it seems I'm missing something.

EDIT: I would accept to embed label in some UIView subclass that can check intristic sizes of subviews and do layout in code, but I'm searching for most clean solution in general.

You can check out xib source in this gist