Как изменить шрифт UIButton в Swift: 3 проверенных способа
Правильный способ изменения шрифта UIButton в Swift
Проблема, с которой вы столкнулись, очень распространена среди начинающих разработчиков. Дело в том, что UIButton имеет несколько состояний (UIControl.State), и шрифт нужно устанавливать для каждого состояния отдельно. Однако есть более простой и надёжный способ.
Способ 1: Через titleLabel (рекомендуемый)
Самый правильный подход — использовать свойство titleLabel кнопки, но с одним важным нюансом: установка шрифта должна происходить после того, как заголовок уже задан. Лучше всего делать это в viewDidLoad() или в отдельном методе настройки.
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var myButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
setupButtonFont()
}
private func setupButtonFont() {
// Устанавливаем заголовок (если ещё не установлен в сториборде)
myButton.setTitle("Нажми меня", for: .normal)
// Теперь меняем шрифт — это работает для всех состояний
myButton.titleLabel?.font = UIFont(name: "Helvetica-Bold", size: 20)
// Альтернатива с системным шрифтом
// myButton.titleLabel?.font = UIFont.systemFont(ofSize: 16, weight: .medium)
}
}
Способ 2: Через атрибуты для каждого состояния
Если вам нужно разное оформление для разных состояний кнопки (например, другой шрифт при нажатии), используйте setAttributedTitle:
func setupButtonWithAttributedStrings() {
// Шрифт для обычного состояния
let normalAttributes: [NSAttributedString.Key: Any] = [
.font: UIFont(name: "Helvetica-Bold", size: 20) ?? UIFont.systemFont(ofSize: 20, weight: .bold),
.foregroundColor: UIColor.blue
]
let normalTitle = NSAttributedString(string: "Нажми меня", attributes: normalAttributes)
myButton.setAttributedTitle(normalTitle, for: .normal)
// Шрифт для состояния "нажато"
let highlightedAttributes: [NSAttributedString.Key: Any] = [
.font: UIFont(name: "Helvetica-Bold", size: 22) ?? UIFont.systemFont(ofSize: 22, weight: .bold),
.foregroundColor: UIColor.red
]
let highlightedTitle = NSAttributedString(string: "Нажми меня", attributes: highlightedAttributes)
myButton.setAttributedTitle(highlightedTitle, for: .highlighted)
}
Способ 3: Кастомный шрифт из файла
Если вы добавляете кастомный шрифт в проект, убедитесь, что:
- Файл шрифта (например,
MyCustomFont.ttf) добавлен в Bundle проекта - Шрифт указан в
Info.plistв массивеFonts provided by application - Вы используете правильное имя шрифта (PostScript name), а не имя файла
func setupCustomFont() {
// Найдите PostScript имя шрифта через UIFont.familyNames
// Например: "MyCustomFont-Bold"
guard let customFont = UIFont(name: "MyCustomFont-Bold", size: 18) else {
print("Ошибка: шрифт не найден")
return
}
myButton.titleLabel?.font = customFont
}
Почему ваш код не работал?
- Порядок выполнения: Если вы меняли шрифт до установки заголовка, кнопка могла сбросить настройки
- Storyboard/XIB: Если шрифт задан в Interface Builder, код может переопределить его, но только если выполняется после загрузки view
- Кастомные шрифты: Частая ошибка — неправильное имя шрифта или отсутствие его в Info.plist
Проверка шрифта
Для отладки используйте этот код, чтобы убедиться, что шрифт применился:
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
if let font = myButton.titleLabel?.font {
print("Текущий шрифт: \(font.fontName), размер: \(font.pointSize)")
}
}
Теперь вы знаете все нюансы. Рекомендую использовать первый способ как самый простой и надёжный для большинства случаев.
<<Альтернативный подход: Использование UIAppearance
Если вам нужно изменить шрифт для всех кнопок в приложении сразу, можно воспользоваться UIAppearance. Это удобно для глобальной настройки стиля.
// В AppDelegate.swift или в любом месте до создания кнопок
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Устанавливаем шрифт для всех UIButton
UIButton.appearance().titleLabel?.font = UIFont(name: "Helvetica-Bold", size: 16)
// Или с замыканием для более точной настройки
UIButton.appearance().configureWithFont(UIFont.systemFont(ofSize: 14, weight: .regular))
return true
}
// Расширение для удобства
extension UIButton {
func configureWithFont(_ font: UIFont) {
self.titleLabel?.font = font
}
}
Когда это полезно?
- Когда нужно единообразие стилей во всём приложении
- Для быстрого прототипирования
- Если вы используете тему оформления (theme)
Недостатки
- Может переопределить локальные настройки, если неаккуратно использовать
- Не подходит, если нужны разные шрифты для разных кнопок
Этот способ — хорошее дополнение к основному, особенно для больших проектов с единым дизайном.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги