Avatar ·

Как изменить размер шрифта UILabel в Swift? (программно и в Interface Builder)

Всем привет! Я только начал изучать Swift и пишу своё первое приложение — простой список задач. У меня есть экран с деталями задачи, где название задачи отображается в UILabel. Я хочу, чтобы заголовок задачи был крупнее обычного текста (например, 24pt), а описание — стандартным (17pt). Проблема в том, что я не могу разобраться, как правильно изменить размер шрифта программно. В Interface Builder я вижу поле Font в инспекторе атрибутов, но когда я меняю его там, размер применяется только для этого конкретного экземпляра. А мне нужно, чтобы размер шрифта мог меняться динамически в зависимости от настроек пользователя (например, через слайдер). Вот как я пытаюсь сделать это сейчас: ```swift import UIKit class DetailViewController: UIViewController { @IBOutlet weak var titleLabel: UILabel! @IBOutlet weak var descriptionLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // Пытаюсь изменить размер шрифта titleLabel.font = UIFont(name: "Helvetica", size: 24) descriptionLabel.font = UIFont(name: "Helvetica", size: 17) } } ``` Но это не работает — шрифт остаётся стандартным. Может я неправильно указываю имя шрифта? Или есть другой способ? Я слышал про `UIFont.systemFont(ofSize:)`, но не понимаю, в чём разница. Подскажите, пожалуйста, как правильно изменить размер шрифта UILabel в Swift? Желательно с примерами кода и объяснением, как это сделать и в коде, и через Storyboard. Заранее спасибо! <<>>

Основной способ: изменение шрифта через код

Ваш подход в целом правильный, но есть несколько нюансов. Во-первых, если вы используете системный шрифт (San Francisco на iOS 9+), лучше применять UIFont.systemFont(ofSize:) — это гарантирует, что шрифт будет соответствовать текущей версии iOS и поддерживать Dynamic Type (динамический размер текста). Во-вторых, если вы всё же хотите указать конкретное имя шрифта, убедитесь, что оно написано точно (например, "HelveticaNeue", а не "Helvetica" — последний устарел).

Исправленный код:

import UIKit

class DetailViewController: UIViewController {
    
    @IBOutlet weak var titleLabel: UILabel!
    @IBOutlet weak var descriptionLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Рекомендуемый способ — системный шрифт
        titleLabel.font = UIFont.systemFont(ofSize: 24, weight: .bold) // жирный 24pt
        descriptionLabel.font = UIFont.systemFont(ofSize: 17)          // обычный 17pt
        
        // Альтернатива с конкретным шрифтом:
        // titleLabel.font = UIFont(name: "HelveticaNeue-Bold", size: 24)
        // descriptionLabel.font = UIFont(name: "HelveticaNeue", size: 17)
    }
}

Почему ваш код мог не работать?

  • Неправильное имя шрифта — в iOS шрифт "Helvetica" называется "HelveticaNeue" (или "HelveticaNeue-Regular" для обычного начертания). Чтобы получить список всех доступных шрифтов, используйте: UIFont.familyNames.flatMap { UIFont.fontNames(forFamilyName: $0) }.
  • Шрифт не загружен — если вы используете кастомный шрифт, его нужно добавить в Info.plist (ключ "Fonts provided by application").
  • Изменение после установки attributedText — если вы задаёте attributedText, то шрифт, установленный через .font, может переопределиться атрибутами.

Изменение шрифта в Interface Builder (Storyboard/XIB)

В инспекторе атрибутов (Attributes Inspector) найдите секцию Label → Font. Нажмите на иконку "Т" рядом с названием шрифта — откроется панель, где можно выбрать:

  • System Font — системный шрифт с выбором стиля (Regular, Bold, Italic) и размера.
  • Custom Font — если вы добавили кастомный шрифт в проект.

Важно: если вы меняете шрифт в Interface Builder, это значение будет использоваться по умолчанию, но его можно переопределить в коде (как в примере выше).

Поддержка Dynamic Type (динамический размер текста)

Чтобы шрифт автоматически подстраивался под настройки доступности пользователя (например, если включён увеличенный текст), используйте стили Dynamic Type:

// В коде
titleLabel.font = UIFont.preferredFont(forTextStyle: .title1) // крупный заголовок
descriptionLabel.font = UIFont.preferredFont(forTextStyle: .body) // основной текст

// В Interface Builder: в инспекторе атрибутов выберите "Font" → "Text Styles" → "Title 1", "Body" и т.д.

Для дополнительного контроля можно включить Automatically Adjusts Font (флажок в инспекторе атрибутов) — тогда UILabel будет автоматически сжимать текст, если он не помещается.

Изменение размера шрифта динамически (например, через слайдер)

@IBAction func fontSizeSliderChanged(_ sender: UISlider) {
    let newSize = CGFloat(sender.value) // например, от 10 до 30
    titleLabel.font = UIFont.systemFont(ofSize: newSize, weight: .bold)
}

Итог: для большинства случаев используйте UIFont.systemFont(ofSize:) или UIFont.preferredFont(forTextStyle:) — это надёжно, совместимо с iOS и поддерживает доступность.

<<>>

Использование attributedText для более гибкого управления

Если вам нужно применить разные размеры шрифта к разным частям одного UILabel (например, "Заголовок: Описание"), используйте NSAttributedString:

let attributedString = NSMutableAttributedString(string: "Заголовок: ", attributes: [
    .font: UIFont.systemFont(ofSize: 20, weight: .bold)
])
attributedString.append(NSAttributedString(string: "Описание", attributes: [
    .font: UIFont.systemFont(ofSize: 16)
]))
titleLabel.attributedText = attributedString

Изменение шрифта через UserDefaults для сохранения настроек

Если вы хотите, чтобы пользователь мог изменить размер шрифта и запомнить его, сохраняйте значение в UserDefaults:

// Сохранение
UserDefaults.standard.set(24.0, forKey: "titleFontSize")
// Загрузка и применение
let savedSize = UserDefaults.standard.double(forKey: "titleFontSize")
if savedSize > 0 {
    titleLabel.font = UIFont.systemFont(ofSize: savedSize)
}

Проверка доступных шрифтов

Если вы всё же хотите использовать конкретный шрифт, но не уверены в имени, выполните этот код в консоли:

for family in UIFont.familyNames.sorted() {
    print("Family: \(family)")
    for name in UIFont.fontNames(forFamilyName: family) {
        print("   Font: \(name)")
    }
}

Скопируйте точное имя из вывода и используйте его в UIFont(name:size:).