文本高度变化中的快速视觉延迟

Posted

技术标签:

【中文标题】文本高度变化中的快速视觉延迟【英文标题】:Swift visual delay in text height change 【发布时间】:2015-05-24 20:47:34 【问题描述】:

我有一个带有按钮的主显示屏,当单击该按钮时,它会转换到第二个屏幕。在第二个屏幕中,我有一个带有彩色背景的文本标签,该标签使用自动布局/约束根据屏幕大小而变化。

然后,我将使用以下方法更改该标签中相对于标签大小的字体大小:

LabelName.font = LabelName.text.fontWithSize(LabelName.frame.height)

它有效,但有一个问题。当我将上面的行放在 viewDidLoad 中时,什么也没有发生……文本保持不变。当我将它放在 viewDidAppear 中时,它会发生变化,但会在短时间内显示在标签上的原始文本大小,然后再更改。

我在这里遇到的问题是,当我转入该屏幕时,我可以看到标签始终是正确的、调整后的大小(即使在转场期间)。它会根据屏幕大小自行放大...所以既然总是不延迟,那么文本大小行不应该延迟吗?我使用了一些输出行,在 viewDidAppear 中,该标签的框架是原始大小,而在 viewDidAppear 中,它是应该没有延迟的大小。然而文本延迟。

我能看到的唯一原因是自动/布局约束在视图加载之后但出现之前进行了调整,并且 viewDidAppear 中的实际 swift 代码仅在视图完成 seguing 并完全显示在屏幕上之后执行。但我不确定这是不是真的......

将不胜感激,甚至无需直接代码即可根据标签大小调整文本的更好方法会很棒。我在属性中没有看到简单的“将字体大小调整为标签大小”选项。也许有,我只是还没有注意到它。在必须直接对其进行编码之前执行此操作的任何方法都会很好,但只是一个通用的解决方法即可。我只是不想看到那一点延迟。它不是很流畅或令人赏心悦目。

【问题讨论】:

倒数第三段,第一个 viewDidAppear 应该是 viewDidLoad。道歉。 【参考方案1】:

你的理论是正确的。自动布局在ViewDidLoad() 之后布置视图,您需要在调整字体之前完成此操作。将字体调整代码移动到 viewDidLayoutSubviews() 的覆盖位置,这发生在自动布局之后但视图出现在屏幕上之前。

override func viewDidLayoutSubviews() 
    super.viewDidLayoutSubviews()
    LabelName.font = LabelName.text.fontWithSize(LabelName.frame.height)

【讨论】:

不知道你可以这样做。谢谢!我有一个简短的解决方法,将文本高度保存在 NSUserDefaults 中,因此在第一次打开它之后,它每次都知道大小。但这看起来更好更整洁。再次感谢:)

以上是关于文本高度变化中的快速视觉延迟的主要内容,如果未能解决你的问题,请参考以下文章

多行文本框的高度变化

更改 UISearchBar 中的 UITextField 高度 - Swift 3

用Vue实现高度自增的文本框

如何根据标签文本快速更改表格视图单元格高度?

怎么调整textarea的高度随文本变化,求CSS

wpf dataGrid的 rowheight 自动适用(根据最后一个备注的文本框的高度变化)