问题标签 [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 投票
1 回答
134 浏览

swift - UIStackView 分布,一个子视图的内在内容大小优先

我想在具有以下条件的( ) 中布局两个视图 (topViewbottomView) :UIStackViewstackView

  • stackView有一个高度(比如说 300)
  • topView's 和bottomView' 的内在内容高度相同(比如说 50)
  • topView's 应该以其内在内容高度(最高stackView's 高度)呈现(所以 50)
  • bottomView应该占用剩余空间(所以 250)
  • iftopView的内在内容高度发生变化(假设为 100),分布应为 100/200

UIStackView 的所有分发模式都无法涵盖这一点。

使用常量设置约束在这里无济于事,因为topView可能会改变的内在内容高度。

所以我需要一些自动布局功能。我尝试设置不同的内容压缩阻力优先级和内容拥抱优先级。如果没有成功,我仍然觉得它们可以成为一个解决方案(如果我知道如何正确使用它们)。

这似乎不是一个复杂的问题,我找不到合适的 Auto Layout API。有什么提示吗?

0 投票
1 回答
54 浏览

ios - 自定义 UIView 上的 IntrinsicContentSize 拉伸内容

我想创建一个UIView使用/提供 IntrinsicContentSize 的自定义,因为它的高度取决于其内容(就像高度取决于文本的标签一样)。

虽然我找到了很多关于如何使用现有视图提供的 IntrinsicContentSize 的信息,但我发现了一些关于如何在自定义上使用 IntrinsicContentSize 的信息UIView

  • 初始高点设置为50

  • 这些draw方法绘制一个大小为灰色的矩形25

  • 高度更改为300invalidateIntrinsicContentSize()称为

  • 在 InterfaceBuilder 中放置一个MyView实例没有任何问题。视图不需要高度约束

但是,在 IB 中使用初始高度50为什么?IB 绘制灰色矩形,因此该draw方法被调用。那么为什么高度没有改为300呢?

还有什么奇怪的:当设置背景颜色时,它也被绘制,也super.draw(...)没有被调用。这是故意的吗?

我希望有一个高度为 的视图,300顶部有一个高度为 的灰色矩形25。但是,在模拟器中运行项目时,结果是不同的:

  • 视图的高度 = 300-好的
  • 内容高度(= 灰色矩形)= 150(半视图高度) -不正常

似乎内容已从其原始高度拉伸,25以保持其与视图的相对高度。为什么是这样?

在此处输入图像描述

0 投票
1 回答
65 浏览

ios - UITableView + AutoLayout + 固有尺寸:在哪里/何时计算尺寸?

我创建了一个自定义视图,该视图MyIntrincView在设置其内容时自动计算其高度。这在模拟器和 InterfaceBuilder 中都可以正常工作。

但是,当放置MyIntrinsicView在 a中时UITableViewCell,单元格高度计算正确。所有单元格都保持相同的初始高度,而不是自动将单元格高度应用于视图的固有高度。

我希望每个单元格都有不同的高度(20 * someProperty= 20 * indexPath.row)。但是,所有单元格都具有相同的初始高度。

仅当显式调用myIntrinsicView.layoutSubviews()单元格时,才会创建具有正确高度的单元格。

似乎 tableView 没有调用myIntrinsicView.layoutSubviews(). 为什么是这样?

当使用具有不同文本长度UILabelMyIntrinsicView单元格内容时,一切都按预期工作。因此,整个 tableView 设置是正确的(= 单元格大小是自动计算的),并且必须有办法正确使用内在大小UITableView那么,这样做的正确方法到底是什么?

0 投票
1 回答
173 浏览

ios - Swift - 没有按时调用 intrinsicContentSize

我的界面构建器中有以下结构:

当按下按钮时,CustomView 的逻辑应该使底部标签出现,因此再次计算 IntrinsicContentSize。不幸的是,只有在第二个按钮单击后才能正确显示视图。

以下是相关代码:

在此处输入图像描述 在此处输入图像描述

0 投票
2 回答
128 浏览

ios - 如何在自定义 UIView 中正确使用 intrincSize。在哪里/何时计算和更新大小?

几天来,我一直在尝试理解和利用intrinsicSize一个习惯UIView。迄今为止收效甚微。

这篇文章很长,很抱歉 :-) 问题是,这个话题很复杂。虽然我知道可能还有其他解决方案,但我只是想了解如何intrinsicSize正确使用。

因此,当有人知道有关如何使用/实施的深入解释的良好来源时,intrinsicSize您可以跳过我所有的问题,只留下链接。

我的目标:

创建一个自定义UIView,用于intrinsicSize让 AutoLayout 自动采用不同的内容。就像 aUILabel根据其文本内容、字体、字体大小等自动调整大小一样。

作为一个例子,假设一个简单的视图RectsView除了绘制给定数量的给定尺寸和给定间距的矩形之外什么都不做。如果不是所有的矩形都适合一行,则内容被包装并在另一行中继续绘制。因此,视图的高度取决于不同的属性(矩形数量、矩形大小、间距等)

这很像一个UILabel,但不是单词或字母,而是绘制简单的矩形。然而,虽然UILabel效果很好,但我的RectsView.

为什么intrinsicSize

正如@DonMag 在他对我上一个问题的出色回答中指出的那样,我不必使用它intrinsicSize来实现我的目标。我还可以使用子视图并添加约束来创建这样的矩形模式。或者我可以使用 aUICollectionView等。

虽然这肯定会奏效,但我认为它会增加很多开销。如果目标是重新创建一个UILabel类,则不会使用 AutoLayout 或 CollectionView 将字母排列成单词,对吗?相反,人们肯定会尝试手动绘制字母......尤其是RectsView在 TableView 或 CollectionView 中使用直接绘制的普通视图肯定比使用 AutoLayout 排列的大量子视图编译的复杂解决方案要好。

当然,这是一个极端的例子。但是,归根结底,在某些情况下使用intrinsicSize肯定是更好的选择。由于UILabel和其他内置视图intrinsicSize完美使用,因此必须有一种方法可以使其正常工作,我只想知道如何:-)

我对内在尺寸的理解

@DonMag 怀疑,“我并不真正理解 intrinsicContentSize 做什么和不做什么”。他很可能是正确的:-) 但是,问题是我没有找到真正解释它的来源......因此我花了几个小时试图了解如何正确使用intrinsicSize而没有一点进展。

这是我从文档中学到的:

  • intrinsicSize是 中使用的功能AutoLayout。提供固有高度和/或宽度的视图不需要为这些值指定约束。
  • 不能保证视图会完全得到它的intrinsicSize. 它更像是告诉 autoLayout 哪种尺寸最适合视图,而 autoLayout 将计算实际尺寸。
  • 计算是使用intrinsicSizeCompression Resistance+Content Hugging属性完成的。
  • 的计算intrinsicSize应该只取决于内容,而不是视图框架。

我不明白的是:

  • 计算如何独立于视图框架?当然UIImageView可以使用其图像的大小,但UILabel显然只能根据其内容和宽度来计算 a 的高度。那么我怎么能RectsView在不考虑框架宽度的情况下计算它的高度呢?
  • 什么时候应该进行计算intrinsicSize?在我的示例中,RectsView大小取决于矩形大小、间距和数量。在 aUILabel中,大小还取决于多个属性,如文本、字体、字体大小等。如果在设置每个属性时进行计算,则会执行多次,这是非常低效的。那么什么是正确的地方呢?

示例实现:

这是我的一个简单实现RectsView

问题:

基本上intrinsicSize工作正常:当 TableView 第一次呈现时,每一行都有不同的高度,具体取决于其内在内容。但是,大小不正确,因为它intrinsicSize是在 TableView 实际布局其子视图之前计算的。因此RectsViews 使用默认宽度而不是实际的最终宽度来计算它们的内容大小。

那么:何时/何处计算初始布局?

此外,对属性的更新(= 点击单元格)未正确处理

那么:何时/何处计算更新的布局?

在此处输入图像描述

再次:抱歉,很长的帖子,如果您能读到这里,非常感谢。我非常感谢!

我您知道任何可以解释所有这些的好的来源/教程/方法,我很高兴您可以提供任何链接!

更新:更多观察

我已经向我RectsView的子类和子类添加了一些调试输出,UILabel以查看如何intrinsicContentSize使用。

RectsView intrinsicContentSize将边界设置为其最终大小之前,仅调用一次。由于此时我还不知道最终尺寸,我只能根据旧的、过时的宽度来计算内在尺寸,这会导致错误的结果。

然而UIViewintrinsicContentSize被多次调用(为什么?)并且在最后一次调用中,结果似乎适合即将到来的最终大小。在这一点上如何知道这个大小?

第一次调用时UILabel返回一个固有宽度,65536.0这是某个常数吗?我只知道UIView.noIntrinsicMetric = -1哪个指定,视图在给定维度中没有内在大小。

为什么,被intrinsicContentSize多次调用UILabel?我试图返回相同的大小(65536.0, 20.333333333333332)RectsView但这没有任何区别,intrinsicContentSize仍然只调用一次。

在最后一次调用该值intrinsicContentSize是返回。似乎知道在这一点上,它将被重新调整为宽度,但是如何呢?UILabel(338.0, 40.666666666666664)UILabel350

另一个观察是,在两个视图上都intrinsicContentSize没有调用after bounds.didSetintrinsicContentSize 因此,必须有一种方法可以知道之前 即将到来的帧变化bounds.didSet如何?

更新 2:

我已将调试输出添加到以下其他UILabel方法中,但未调用它们因此似乎不会影响问题):

0 投票
1 回答
68 浏览

swift - 动态更改内容大小 UIScrollView

我有一个滚动视图,第一次加载视图时,大小是动态设置的,但是当我点击按钮时,我的元素的内部大小会发生变化,我需要更改滚动的内部大小,但它没有改变。有人知道如何解决吗?

0 投票
0 回答
70 浏览

ios - IntrinsicContentSize 在 iOS 15 中有效,但在 iOS 13 和 14 中无效

我创建了一个自定义文本字段,因为我需要一个使用“invalidateIntrinsicContentSize”的多行文本字段来设置文本每次更改的大小。在 iOS 15 中它可以完美运行,但在 iOS 13 和 14 中它无法正常工作。

我尝试调试此代码,如果我使用的是 iOS 15,它会调用 invalidateIntrinsicContentSize,然后它进入intrinsicContentSize 并设置新大小。如果我使用 iOS 13/14,则会调用 invalidateIntrinsicContentSize,但它不会进入intrinsicContentSize,因此大小不会改变。

有人能告诉我如何让它在 iOS 13/14 中工作吗?

感谢您的耐心和帮助!