Swift 文本高度变化的视觉延迟
Swift visual delay in text height change
我有一个带按钮的主显示屏,单击该按钮后,它会转换到第二个屏幕。在第二个屏幕中,我有一个带有彩色背景的文本标签,它会根据使用自动布局/约束的屏幕大小而变化。
然后我使用以下方法更改该标签中相对于标签大小的字体大小:
LabelName.font = LabelName.text.fontWithSize(LabelName.frame.height)
它有效,但有一个问题。当我将上面的行放在 viewDidLoad 中时,没有任何反应......文本保持不变。当我把它放在 viewDidAppear 中时,它发生了变化,但在短暂的一瞬间,原始文本大小显示在更改之前的标签上。
我在这里遇到的问题是,当我转入该屏幕时,我可以看到标签始终是正确的、调整后的大小(即使在转场期间)。它会根据屏幕尺寸自动放大......所以既然它总是不会延迟,那么文本大小行不应该被延迟吗?我使用了一些输出线,在 viewDidAppear 中,该标签的框架是原始大小,在 viewDidAppear 中,它是应该没有延迟的大小。然而文本延迟。
我能看到的唯一原因是 auto/layout 约束在视图加载之后但出现之前进行了调整,而 viewDidAppear 中的实际 swift 代码仅在视图完成 seguing 之后执行并完全出现在屏幕上。但是我不确定这是不是真的....
我们将不胜感激,如果有一种无需直接代码即可根据标签大小调整文本的更好方法,那就太棒了。我在属性中没有看到简单的 "Adjust font size to label size" 选项。也许有,只是我还没有意识到。在必须直接对其进行编码之前执行此操作的任何方法都很好,但是只有通用的解决方法才有效。我只是不想看到那一点延迟。不是很流畅,也不是很赏心悦目。
你的理论是正确的。自动布局在 ViewDidLoad()
之后布置视图,您需要在调整字体之前完成此操作。将您的字体调整代码移动到 viewDidLayoutSubviews()
的覆盖,这发生在自动布局之后但视图出现在屏幕上之前。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
LabelName.font = LabelName.text.fontWithSize(LabelName.frame.height)
}
我有一个带按钮的主显示屏,单击该按钮后,它会转换到第二个屏幕。在第二个屏幕中,我有一个带有彩色背景的文本标签,它会根据使用自动布局/约束的屏幕大小而变化。
然后我使用以下方法更改该标签中相对于标签大小的字体大小:
LabelName.font = LabelName.text.fontWithSize(LabelName.frame.height)
它有效,但有一个问题。当我将上面的行放在 viewDidLoad 中时,没有任何反应......文本保持不变。当我把它放在 viewDidAppear 中时,它发生了变化,但在短暂的一瞬间,原始文本大小显示在更改之前的标签上。
我在这里遇到的问题是,当我转入该屏幕时,我可以看到标签始终是正确的、调整后的大小(即使在转场期间)。它会根据屏幕尺寸自动放大......所以既然它总是不会延迟,那么文本大小行不应该被延迟吗?我使用了一些输出线,在 viewDidAppear 中,该标签的框架是原始大小,在 viewDidAppear 中,它是应该没有延迟的大小。然而文本延迟。
我能看到的唯一原因是 auto/layout 约束在视图加载之后但出现之前进行了调整,而 viewDidAppear 中的实际 swift 代码仅在视图完成 seguing 之后执行并完全出现在屏幕上。但是我不确定这是不是真的....
我们将不胜感激,如果有一种无需直接代码即可根据标签大小调整文本的更好方法,那就太棒了。我在属性中没有看到简单的 "Adjust font size to label size" 选项。也许有,只是我还没有意识到。在必须直接对其进行编码之前执行此操作的任何方法都很好,但是只有通用的解决方法才有效。我只是不想看到那一点延迟。不是很流畅,也不是很赏心悦目。
你的理论是正确的。自动布局在 ViewDidLoad()
之后布置视图,您需要在调整字体之前完成此操作。将您的字体调整代码移动到 viewDidLayoutSubviews()
的覆盖,这发生在自动布局之后但视图出现在屏幕上之前。
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
LabelName.font = LabelName.text.fontWithSize(LabelName.frame.height)
}