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 的调用。 根据您的布局描述,您根本不需要intrinsicContentHeightUIStackView 将在您显示/隐藏其中一个排列的子视图时自动调整其高度。 @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

Swift 4:没有调用 didSelectRowAt 委托

在 Swift 中调用实例方法错误消息没有完全匹配