逐步更改iPad Pro的字体大小

时间:2018-02-15 16:21:27

标签: ios swift autolayout uilabel

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

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

我尝试了自动收缩和最小字体大小的IB中的各种选项,但随后应用程序选择48-32之间的字体大小并给出随机外观。但是我只希望拥有48英寸12英寸或32英寸所有更小的设备 - 两者之间没有任何东西可以获得一致的外观。

我的下一个想法是在IB中将所有标签的固定字体大小设置为32,并为所有标签添加标签,并在'viewDidLoad'上的每个viewcontroller中运行以下代码:

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? autolayout有问题吗?标签只有宽度约束和上边距,以及X / Y位置。

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

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

但字体大小绝对不是48.它看起来与将IB中的字体大小直接设置为48不同。

1 个答案:

答案 0 :(得分:2)

  1. 子类UILabel,在Interface Builder中为每个uilabel设置该类。

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

  3. 确定当前设备并将其存储在枚举

  4. 的值中
  5. 在步骤1中覆盖子类UILabel的初始值设定项,并从步骤3中定义的varbele中获取字体大小,步骤2中的值为

  6. 代码:

    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
        }
    }