Как изменить размер шрифта UILabel в Swift? (программно и в Interface Builder)
Основной способ: изменение шрифта через код
Ваш подход в целом правильный, но есть несколько нюансов. Во-первых, если вы используете системный шрифт (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:).