问题标签 [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.
swift - UIStackView 分布,一个子视图的内在内容大小优先
我想在具有以下条件的( ) 中布局两个视图 (topView
和bottomView
) :UIStackView
stackView
stackView
有一个高度(比如说 300)topView
's 和bottomView
' 的内在内容高度相同(比如说 50)topView
's 应该以其内在内容高度(最高stackView
's 高度)呈现(所以 50)bottomView
应该占用剩余空间(所以 250)- if
topView
的内在内容高度发生变化(假设为 100),分布应为 100/200
UIStackView 的所有分发模式都无法涵盖这一点。
使用常量设置约束在这里无济于事,因为topView
可能会改变的内在内容高度。
所以我需要一些自动布局功能。我尝试设置不同的内容压缩阻力优先级和内容拥抱优先级。如果没有成功,我仍然觉得它们可以成为一个解决方案(如果我知道如何正确使用它们)。
这似乎不是一个复杂的问题,我找不到合适的 Auto Layout API。有什么提示吗?
ios - 自定义 UIView 上的 IntrinsicContentSize 拉伸内容
我想创建一个UIView
使用/提供 IntrinsicContentSize 的自定义,因为它的高度取决于其内容(就像高度取决于文本的标签一样)。
虽然我找到了很多关于如何使用现有视图提供的 IntrinsicContentSize 的信息,但我发现了一些关于如何在自定义上使用 IntrinsicContentSize 的信息UIView
:
初始高点设置为
50
这些
draw
方法绘制一个大小为灰色的矩形25
高度更改为
300
并invalidateIntrinsicContentSize()
称为在 InterfaceBuilder 中放置一个
MyView
实例没有任何问题。视图不需要高度约束
但是,在 IB 中使用初始高度50
。为什么?IB 绘制灰色矩形,因此该draw
方法被调用。那么为什么高度没有改为300呢?
还有什么奇怪的:当设置背景颜色时,它也被绘制,也super.draw(...)
没有被调用。这是故意的吗?
我希望有一个高度为 的视图,300
顶部有一个高度为 的灰色矩形25
。但是,在模拟器中运行项目时,结果是不同的:
- 视图的高度 =
300
-好的 - 内容高度(= 灰色矩形)= 150(半视图高度) -不正常
似乎内容已从其原始高度拉伸,25
以保持其与视图的相对高度。为什么是这样?
ios - UITableView + AutoLayout + 固有尺寸:在哪里/何时计算尺寸?
我创建了一个自定义视图,该视图MyIntrincView
在设置其内容时自动计算其高度。这在模拟器和 InterfaceBuilder 中都可以正常工作。
但是,当放置MyIntrinsicView
在 a中时UITableViewCell
,单元格高度计算不正确。所有单元格都保持相同的初始高度,而不是自动将单元格高度应用于视图的固有高度。
我希望每个单元格都有不同的高度(20 * someProperty
= 20 * indexPath.row
)。但是,所有单元格都具有相同的初始高度。
仅当显式调用myIntrinsicView.layoutSubviews()
单元格时,才会创建具有正确高度的单元格。
似乎 tableView 没有调用myIntrinsicView.layoutSubviews()
. 为什么是这样?
当使用具有不同文本长度UILabel
的MyIntrinsicView
单元格内容时,一切都按预期工作。因此,整个 tableView 设置是正确的(= 单元格大小是自动计算的),并且必须有办法正确使用内在大小UITableView
。那么,这样做的正确方法到底是什么?
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 将计算实际尺寸。 - 计算是使用
intrinsicSize
和Compression Resistance
+Content Hugging
属性完成的。 - 的计算
intrinsicSize
应该只取决于内容,而不是视图框架。
我不明白的是:
- 计算如何独立于视图框架?当然
UIImageView
可以使用其图像的大小,但UILabel
显然只能根据其内容和宽度来计算 a 的高度。那么我怎么能RectsView
在不考虑框架宽度的情况下计算它的高度呢? - 什么时候应该进行计算
intrinsicSize
?在我的示例中,RectsView
大小取决于矩形大小、间距和数量。在 aUILabel
中,大小还取决于多个属性,如文本、字体、字体大小等。如果在设置每个属性时进行计算,则会执行多次,这是非常低效的。那么什么是正确的地方呢?
示例实现:
这是我的一个简单实现RectsView
:
问题:
基本上intrinsicSize
工作正常:当 TableView 第一次呈现时,每一行都有不同的高度,具体取决于其内在内容。但是,大小不正确,因为它intrinsicSize
是在 TableView 实际布局其子视图之前计算的。因此RectsView
s 使用默认宽度而不是实际的最终宽度来计算它们的内容大小。
那么:何时/何处计算初始布局?
此外,对属性的更新(= 点击单元格)未正确处理
那么:何时/何处计算更新的布局?
再次:抱歉,很长的帖子,如果您能读到这里,非常感谢。我非常感谢!
我您知道任何可以解释所有这些的好的来源/教程/方法,我很高兴您可以提供任何链接!
更新:更多观察
我已经向我RectsView
的子类和子类添加了一些调试输出,UILabel
以查看如何intrinsicContentSize
使用。
在RectsView
intrinsicContentSize
将边界设置为其最终大小之前,仅调用一次。由于此时我还不知道最终尺寸,我只能根据旧的、过时的宽度来计算内在尺寸,这会导致错误的结果。
然而UIView
,intrinsicContentSize
被多次调用(为什么?)并且在最后一次调用中,结果似乎适合即将到来的最终大小。在这一点上如何知道这个大小?
第一次调用时UILabel
返回一个固有宽度,65536.0
这是某个常数吗?我只知道UIView.noIntrinsicMetric = -1
哪个指定,视图在给定维度中没有内在大小。
为什么,被intrinsicContentSize
多次调用UILabel
?我试图返回相同的大小(65536.0, 20.333333333333332)
,RectsView
但这没有任何区别,intrinsicContentSize
仍然只调用一次。
在最后一次调用该值intrinsicContentSize
是返回。似乎知道在这一点上,它将被重新调整为宽度,但是如何呢?UILabel
(338.0, 40.666666666666664)
UILabel
350
另一个观察是,在两个视图上都intrinsicContentSize
没有调用after bounds.didSet
。intrinsicContentSize
因此,必须有一种方法可以知道之前 即将到来的帧变化bounds.didSet
。如何?
更新 2:
我已将调试输出添加到以下其他UILabel
方法中,但未调用它们(因此似乎不会影响问题):
swift - 动态更改内容大小 UIScrollView
我有一个滚动视图,第一次加载视图时,大小是动态设置的,但是当我点击按钮时,我的元素的内部大小会发生变化,我需要更改滚动的内部大小,但它没有改变。有人知道如何解决吗?
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 中工作吗?
感谢您的耐心和帮助!