逐步更改 iPad Pro 的字体大小

Posted

技术标签:

【中文标题】逐步更改 iPad Pro 的字体大小【英文标题】:Change font size for iPad Pro in steps 【发布时间】:2018-02-15 16:21:27 【问题描述】:

我有一个应用程序,仅适用于横向模式下的 iPad。屏幕设计完全在 IB 中完成,带有自动布局。

现在我想实现以下行为:在 iPad Pro 12" 上时,所有标签的字体大小应为 48,对于所有较小的 iPad 尺寸,字体大小应为 32。

我在 IB 中尝试了具有自动收缩和最小字体大小的各种选项,但随后应用程序会选择 48 到 32 之间的字体大小并给出随机外观。但我只想为 12" 设置 48 个或为所有较小的设备设置 32 个 - 为了获得一致的外观,两者之间没有任何关系。

我的下一个想法是在 IB 中将所有标签的固定字体大小设置为 32,并给所有标签一个标签,并在“viewDidLoad”上的每个视图控制器中运行以下代码:

UIDevice 扩展

public var isPadPro12: Bool 
    if (UIDevice.current.userInterfaceIdiom == UIUserInterfaceIdiom.pad
        && UIScreen.main.nativeBounds.size.height == 2732) 
        return true
    
    return false

在“viewDidLoad”中调用的代码

func adjustFont() 
    let isPro12 = UIDevice.current.isPadPro12
    if isPro12 
        for subview in view.subviews 
            if subview.tag == 999 
                if let labelView = subview as? UILabel 
                    labelView.font = labelView.font.withSize(48)
                    print ("font size \(labelView.font)")
                
            
        
    

它仅适用于某些标签,其他一些仍在 32 中。我该怎么做才能将标签强制为 48?自动布局有问题吗?标签只有宽度约束和上边距以及 X/Y 位置。

编辑 当我在字体大小调整后添加调试打印时,我得到以下结果:

font size Optional(<UICTFont: 0x7fcbf7c2ea90> font-family: "Arial"; font-weight: normal; font-style: normal; font-size: 48.00pt)

但是字体大小肯定不是48,看起来和在IB里直接设置字体大小为48不一样。

【问题讨论】:

您确定将 999 设置为所有标签的标签吗? 是的,当然。 你这里没有做深度循环。您确定所有标签都在视图级别吗? @Gihan:是的,所有标签都是视图的直接子级。我在上面的循环中确实打印了debugs,字体大小调整的那一行肯定被调用了。 您不应根据设备类型做出这些决定。当用户使用多任务处理并且您的应用程序仅占用屏幕的 1/3 时,您是否仍然想要不同的字体?根据视图大小而非设备做出决定。 【参考方案1】:

    子类 UILabel,为 Interface Builder 中的每个 uilabel 设置该类。

    为您想要支持的所有不同类型/字体创建一个枚举,并在该枚举中创建一个函数,返回例如字体大小

    确定当前设备并将其存储在来自枚举的值中

    在步骤 1 中覆盖子类 UILabel 的初始化程序,并从步骤 3 中定义的变量中获取字体大小,并使用步骤 2 中的值

代码:

var currentScreen = Screens.iPadLarge //change this to current device


enum Screens
    case iPadLarge, iPadSmall
    func getFont() -> CGFloat
        switch self
        case .iPadLarge:
            return 40
        case .iPadSmall:
            return 20
        
    


class MyLabel: UILabel

    init(frame: CGRect)
        super.init(frame: frame)
        commonLoad()
    

    required init?(coder aDecoder: NSCoder) 
        super.init(coder: aDecoder)
        commonLoad()
    

    func commonLoad()
        let fontSize = currentScreen.getFont()
        //use fontSize
    

【讨论】:

您有代码示例,尤其是第 4 步的代码示例吗?谢谢。 @FrankZp,你期待在 IB 中看到这个吗?否则,这听起来很简单。 (是的,您无法在 IB 中看到它。) @FrankZp 是的,我可以在 10 分钟内编写一些示例代码,我认为不可能在 interfacebuilder 中立即显示结果,因为输出不是在编译时生成的 @J.Doe:好的,谢谢。我知道在 IB 中没有看到这一点。我只是要求在您的回复中添加代码。 @J.Doe:感谢代码。不幸的是,同样的事情发生了——在代码中添加“self.font = font.withSize(fontSize)”时,标签不会以更大的字体显示,但如果我在标签上进行打印调试,它会显示给我字体大小设置得更大——但事实并非如此。毫无头绪...

以上是关于逐步更改 iPad Pro 的字体大小的主要内容,如果未能解决你的问题,请参考以下文章

css 在Genesis Portfolio Pro插件上更改投资组合项目标题的字体大小

微信小程序在ipad上字体变大怎么办

unity pro xl编程的字体大小

选择中的 Ipad 和选项字体大小

如何在 iOS 中调整 iPad 的字体大小? (冲突元素)

如何为 UILabel 字体更改设置动画?