Avatar ·

Как изменить шрифт UIButton в Swift: 3 проверенных способа

Всем привет! Я новичок в Swift и разработке под iOS. Столкнулся с проблемой: никак не могу изменить шрифт для UIButton. Создаю кнопку через Interface Builder, подключаю IBOutlet, и пытаюсь задать шрифт программно. Вот мой код: ```swift import UIKit class ViewController: UIViewController { @IBOutlet weak var myButton: UIButton! override func viewDidLoad() { super.viewDidLoad() // Пытаюсь изменить шрифт myButton.titleLabel?.font = UIFont(name: "Helvetica-Bold", size: 20) // Или так: myButton.titleLabel?.font = UIFont.systemFont(ofSize: 16) } } ``` Но шрифт не меняется! Я уже перепробовал разные варианты: ставил шрифт в Interface Builder, менял в коде до и после установки заголовка. Иногда работает, иногда нет. Особенно когда я хочу использовать кастомный шрифт, который добавил в проект. Подскажите, пожалуйста, как правильно менять шрифт у UIButton? Может быть, есть какой-то нюанс с состоянием кнопки (normal, highlighted, selected)? Или нужно использовать другой подход? Буду благодарен за подробное объяснение с примерами кода. <<>>

Правильный способ изменения шрифта 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)

Недостатки

  • Может переопределить локальные настройки, если неаккуратно использовать
  • Не подходит, если нужны разные шрифты для разных кнопок

Этот способ — хорошее дополнение к основному, особенно для больших проектов с единым дизайном.