Swift - 没有按时调用intrinsicContentSize
Posted
技术标签:
【中文标题】Swift - 没有按时调用intrinsicContentSize【英文标题】:Swift - intrinsicContentSize is not called on time 【发布时间】:2021-06-12 03:47:20 【问题描述】:我的界面构建器中有以下结构:
MyCustomView
StackView
Label
TextField
Label - is hidden
Button
当按钮被按下时,CustomView 的逻辑应该使底部标签出现,因此再次计算 IntrinsicContentSize。不幸的是,只有在第二个按钮单击后才能正确显示视图。
以下是相关代码:
public class MyCustomView: UIView
...
var subtitle: String!
didSet
subtitleLabel.isHidden = subtitle.isEmpty
subtitleLabel.text = subtitle
invalidateIntrinsicContentSize()
....
override public var intrinsicContentSize: CGSize
stackView.layoutIfNeeded()
return stackView.bounds.size
....
【问题讨论】:
当您更改标签的isHidden
属性时,如何在自定义视图上添加对setNeedsLayout
的调用。
根据您的布局描述,您根本不需要intrinsicContentHeight
。 UIStackView
将在您显示/隐藏其中一个排列的子视图时自动调整其高度。
@DonMag,我需要 'intrinsicContentSize' 以便包含 stackView 的 customView 将环绕自动调整的 stackView。
@vacawama 不幸的是它不会出错
@Luda - 仍然不清楚你为什么不使用约束......似乎需要额外的代码来操作视图的 intrinsicContentSize
是额外的、不必要的工作,容易出现其他问题。
【参考方案1】:
在取消隐藏 stackView 子视图之一时,我缺少的行是 stackView.setNeedsLayout()
。
所以这是工作的didSet
:
var subtitle: String!
didSet
subtitleLabel.isHidden = subtitle.isEmpty
subtitleLabel.text = subtitle
stackView.setNeedsLayout()
invalidateIntrinsicContentSize()
【讨论】:
以上是关于Swift - 没有按时调用intrinsicContentSize的主要内容,如果未能解决你的问题,请参考以下文章
从Objective-C到Swift的UITextView类,intrinsicContentSize问题[关闭]
有时 FCM 通知没有收到,有时会延迟 iOS (Swift)
长按时,如何从目标 c 函数而不是 contextMenuInteraction 函数调用 ImagePreviewController: UIViewController?
Swift:没有调用 didRegisterForRemoteNotificationsWithDeviceToken