iPhone Увеличьте размер шрифта для больших устройств

У меня есть простое приложение, в котором есть несколько представлений для показа. Это портретное приложение, поэтому мне не нужно создавать какой-либо другой дизайн для конкретной ориентации.

Но у меня есть одна проблема (я новичок в iOS), я читал о классах размера, и все же я не могу понять, как мне увеличить размер текста/метки на устройстве.

Что я сделал:

Я имею в виду, что я тестирую следующие мобильные телефоны

  1. айфон 5с
  2. айфон 8плюс
  3. айфон хр

У меня есть метка внутри представления, и эта метка имеет 18 пунктов в виде размера текста или размера шрифта.

Что я хочу:

Я хочу, чтобы мой шрифт постепенно увеличивался на больших устройствах, таких как iPhone XR и iPad, и уменьшался на устройствах меньшего размера, таких как iPhone 5s.

Вопрос: я хочу сделать следующее, но я не знаю, как это сделать даже с классами размеров, потому что, насколько я понял, классы размеров больше всего связаны с ориентациями, может быть, я ошибаюсь, но это Я извлек из своих чтений

Я хочу, чтобы на следующем телефоне размер текста был примерно таким

  1. iPhone 5s --> Размер текста 12
  2. iPhone 8Plus --> Размер текста 18
  3. iPhone XR --> Размер текста 19
  4. iPadPro 12 дюймов --> Размер текста 32

Пожалуйста, дайте мне знать, как этого добиться?

Примечание: я хочу сделать это без кодирования, я имею в виду в конструкторе интерфейсов


person A.s.ALI    schedule 20.08.2019    source источник


Ответы (2)


Чтобы решить ваше дело. вам нужно идентифицировать модальное устройство пользователя.

enum DeviceModals : String {
    //iphones
    case iPhone5s_GSM = "iPhone6,1"
    case iPhone5s_China_Gobal = "iPhone6,2"
    case iPhone6_Plus = "iPhone7,1"
    case iPhone6 = "iPhone7,2"
    case iPhone6S = "iPhone8,1"
    case iPhone6S_Plus = "iPhone8,2"
    case iPhoneSE = "iPhone8,4"
    case iPhone7_CDMA = "iPhone9,1"
    case iPhone7_GSM = "iPhone9,3"
    case iPhone7_Plus_CDMA = "iPhone9,2"
    case iPhone7_Plus_GSM = "iPhone9,4"
    case iPhone_8_CDMA =   "iPhone10,1"
    case iPhone_8_GSM =  "iPhone10,4"
    case iPhone_8_Plus_CDMA =  "iPhone10,2"
    case iPhone_8_Plus_GSM =  "iPhone10,5"
    case iPhone_X_CDMA = "iPhone10,3"
    case iPhone_X_GSM =  "iPhone10,6"
    case iPhone_XS = "iPhone11,2"
    case iPhone_XS_Max =   "iPhone11,4"
    case iPhone_XS_Max_China = "iPhone11,6"
    case iPhone_XR =   "iPhone11,8"
    case iPhone_11 =   "iPhone12,1"
    case iPhone_11_Pro =  "iPhone12,3"
    case iPhone_11_Pro_Max =  "iPhone12,5"

    //iPad
   case iPad_Air_wifi_5Gen  =  "iPad4,1"
   case iPad_Air_cellular_5Gen =  "iPad4,2"
   case iPad_Mini_wifi_2Gen = "iPad4,4"
   case iPad_Mini_cellular_2Gen = "iPad4,5"
   case iPad_Mini_wifi_3rd_Gen =  "iPad4,7"
   case iPad_Pro_12_9_A1584 =  "iPad6,7"
   case iPad_Pro_12_9_A1652 =  "iPad6,8"
   case iPad_Pro_9_7_A1673 =  "iPad6,3"
   case iPad_Pro_9_7_A1674 =  "iPad6,4"

    case otherDevice = "other"

}
extension UIDevice {
    var modelName: String {
        var systemInfo = utsname()
        uname(&systemInfo)
        let machineMirror = Mirror(reflecting: systemInfo.machine)
        let identifier = machineMirror.children.reduce("") { identifier, element in
            guard let value = element.value as? Int8, value != 0 else { return identifier }
            return identifier + String(UnicodeScalar(UInt8(value)))
        }
        return identifier
    }
    func deviceModal() -> DeviceModals{
        let deviceName  = UIDevice.current.modelName
        let deviceModal = DeviceModals(rawValue: deviceName) ?? DeviceModals.otherDevice
        return deviceModal
    }
}

Если вы поддерживаете функцию специальных возможностей в своем приложении. Пользователи будут иметь контроллер для размера текста в вашем приложении.

Настройки -> Экран и яркость -> Размер текста.

Этот размер по умолчанию будет меняться для разных устройств в зависимости от размера устройства.

    extension UIFont
    {
    // A scale value based on the current device text size setting.    With the device using the default Large setting, `scaler` will be `1.0`. Only used when `UIFontMetrics` is not available.
        var scaler: CGFloat {
            return UIFont.preferredFont(forTextStyle:.body).pointSize/17.0
         }
       func scaledFont() -> UIFont {
            if #available(iOS 11.0, *) {
                return UIFontMetrics.default.scaledFont(for: self)
            } else {
                return self.withSize(scaler * self.pointSize)
            }
        }
    }

Теперь вы можете использовать кнопки шрифта.

UILabel().font = UIFont.systemFont(ofSize: 12).scaledFont() 

Теперь вы знаете, какие устройства есть у пользователей, поэтому вы можете создать одну пользовательскую метку (или) кнопку (или) AnyComponent с текстовыми данными.

class CustomLabel : UILabel{

    override func awakeFromNib() {
        super.awakeFromNib()
        let deviceModal = UIDevice.current.deviceModal()
        var font_size : CGFloat = 18
        switch deviceModal {
        case .iPhone5s_GSM , .iPhone5s_China_Gobal  :
            font_size = 12
        case .iPhone_8_Plus_CDMA , .iPhone_8_Plus_GSM:
           font_size = 18
        case .iPhone_XR:
            font_size = 19
        default:
            font_size = 18
        }
        self.font = UIFont.systemFont(ofSize: font_size).scaledFont()
    }
}

В вашей раскадровке выберите свою метку, перейдите в правый угол, выберите пользовательский класс и поместите «CustomLabel». Теперь вам не нужно писать какой-либо другой код, он будет работать отлично.

введите здесь описание изображения

Я надеюсь, что ваша проблема теперь решена.

person Manikandan    schedule 22.11.2019
comment
Почему вы поставили расширение на UILabel, а не на UIFont? - person Sulthan; 22.11.2019
comment
мы не можем использовать расширение на UIFont. Если мы используем расширение UIFont, мы должны переопределить шрифт (метод мутации). но «мутирование» недействительно для методов в расширении. - person Manikandan; 22.11.2019
comment
Нет, вы просто возвращаете новый экземпляр. Шрифты в любом случае неизменяемы. - person Sulthan; 22.11.2019
comment
Итак, все разработчик обрабатывает размеры с этим? - person A.s.ALI; 25.11.2019
comment
Этот ответ предназначен для определения имени устройства, а не размеров. Так как вы хотите иметь разные шрифты для разных устройств. Во-первых, вам нужно идентифицировать устройство. Если вы используете размер, другое устройство может иметь одинаковые размеры или ориентацию. Вот почему мы используем здесь имя оборудования. Надеюсь, это поможет вам. - person Manikandan; 25.11.2019
comment
как насчет размеров? я тоже хочу узнать про размеры - person A.s.ALI; 04.12.2019
comment
Вы можете использовать UIScreen.main.bounds, чтобы получить размер устройства. - person Manikandan; 04.12.2019

Классы размеров вам в этом не помогут.

Есть 2 способа сделать это:

  1. Пользовательский размер. У вас может быть функция, которая возвращает размер или мультиплеер в зависимости от текущего устройства. Затем вы должны вручную установить размер шрифта, возвращаемый функцией, или использовать многопользовательский режим, чтобы получить размер на основе некоторого размера по умолчанию.
  2. Максимальный или минимальный размер шрифта метки. Вы можете настроить Автоматическое сжатие вашего ярлыка, чтобы иметь Минимальный размер шрифта. Это можно сделать через конструктор интерфейсов.
person Kolineal    schedule 20.08.2019