UIButton 帧大小不会更新以支持设置中增加的字体大小

UIButton frame size doesn't update to support increased font size from settings

提问人:Shawn Frank 提问时间:9/7/2023 最后编辑:Shawn Frank 更新时间:9/9/2023 访问量:56

问:

我有一个基本的UIButton,具有以下限制:

UIButton autolayout constraint dynamic text font size

我有一些基本的尾随和顶部约束,我将 >= 宽度和高度约束设置为 48,因为我希望 48 是按钮的最小宽度和高度。

我的目标是让按钮中的文本随着用户从设置中更改字体大小而增长。

按钮中的此文本似乎在增加大小,但是,框架似乎没有更新以适应这种增加。

enter image description here

这就是我从控制面板设置字体大小的意思Dynamic text font size control panel iOS Swift

但是,如果我退出应用程序并再次启动它,则帧大小计算正确,并且从控制面板更改文本大小似乎会使按钮中的字体大小适当缩小和增长。

UIButton frame size increase

似乎需要先确定最大宽度/高度。

在代码中,我什至设置了以下内容:

skipButton.titleLabel?.font = UIFont.font(forTextStyle: .body, fontName: .suecaNanoRegular, size: 14)
skipButton.titleLabel?.adjustsFontForContentSizeCategory = true

如何让我的 UIButton 在运行时支持动态字体大小。

这是我的其他按钮设置,如果这有助于调试。

UIButton settings storyboard dynamic text size font swift iOS

iOS Swift UIKIT UIBubutton 自动布局

评论


答:

0赞 matt 9/7/2023 #1

问题是你的字体本身不是动态的。

删除有关标题标签的代码,并将情节提要中的按钮重新配置为“纯样式”而不是“默认样式”,并为其提供动态字体设置,如以下屏幕截图所示:

enter image description here

然后,按钮标题字体大小将按预期运行。

enter image description here

评论

0赞 Shawn Frank 9/7/2023
感谢您分享此内容并使用系统字体,但是我的要求是使用自定义字体。我确实看到 Apple 支持这个:developer.apple.com/documentation/uikit/uifont/... - 但是我无法让它按预期工作。
0赞 Shawn Frank 9/7/2023
此外,另一个具有相同字体的按钮似乎正在缩放大小,该按钮具有更大的宽度和高度限制,因此它使我相信我没有正确设置约束。
0赞 matt 9/7/2023
如果要使用自定义字体,则需要通过 UIFontMetrics 传递它。但是,你不能在情节提要中配置它,你的代码也不是你如何配置的。
0赞 matt 9/7/2023
它与约束无关。这是我的回答告诉你的字体。
0赞 Shawn Frank 9/7/2023
请看一下我更新/更正的问题。字体大小似乎在增加,但框架无法容纳它。
1赞 DonMag 9/7/2023 #2

这似乎对我有用......

向 Storyboard 添加一个按钮,仅更改 3 个属性

  • 样式:默认
  • 名称: Skip
  • 背景:黄色(这样我们就可以在运行时看到取景)

约束:

enter image description here

enter image description here

在我的项目中添加了一种随机字体 - “Gotham-BookItalic.otf”

视图控制器类:

class DynamicFontVC: UIViewController {
    
    @IBOutlet var skipButton: UIButton!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        guard let customFont = UIFont(name: "Gotham-BookItalic", size: 14.0) else {
            fatalError("Could not load font!")
        }
        
        skipButton.titleLabel?.font = UIFontMetrics(forTextStyle: .body).scaledFont(for: customFont)
        skipButton.titleLabel?.adjustsFontForContentSizeCategory = true
    }
    
}

结果:

enter image description here


编辑 -- 将“控件对齐方式”设置为“尾随/顶部”:

enter image description here

评论

0赞 Shawn Frank 9/8/2023
谢谢,这个解决方案似乎走在正确的轨道上,但是,它似乎确实有一些填充到顶部和尾部,至少在最初是这样。也许这是插图?理想情况下,我希望它始终粘在黄色框的顶部后角。
0赞 DonMag 9/8/2023
@ShawnFrank - 我没有设置控件对齐方式。按照您在帖子图片中显示的方式进行设置,标题将“粘在顶部和尾部”,并且仍然处理大小变化。
0赞 Shawn Frank 9/11/2023
谢谢 DonMag,我很快就会尝试一下。