Кнопка в SwiftUI: стили, настройки и лучшие практики

Кнопки — один из ключевых элементов взаимодействия в любом приложении. SwiftUI предлагает гибкий способ их создания, позволяя легко изменять внешний вид и поведение. В этой статье мы разберем стандартные и кастомные стили кнопок, а также лучшие практики их использования.

🔹 Создание базовой кнопки

Создать кнопку в SwiftUI можно буквально в одну строку:

Button("Нажми меня!") { print("Кнопка нажата!") }
SwiftUI автоматически применяет стандартный стиль, адаптируя внешний вид кнопки под платформу.
SwiftUI автоматически применяет стандартный стиль, адаптируя внешний вид кнопки под платформу.

Если кнопка содержит иконку, можно использовать SF Symbols:

Button("Играть", systemImage: "play.fill") { print("Запуск!") }
Кнопка в SwiftUI: стили, настройки и лучшие практики

А для пользовательских изображений:

Button { print("Кнопка нажата!") } label: { HStack { Image(systemName: "star.fill") .resizable() .scaledToFit() .frame(width: 50, height: 50) .foregroundColor(.yellow) Text("Нажми меня!") } }
Кнопка в SwiftUI: стили, настройки и лучшие практики

🎨 Использование стандартных стилей кнопок

SwiftUI предлагает несколько встроенных стилей:

Button("Нажми меня!") { print("Кнопка нажата!") } .buttonStyle(.borderedProminent) // Яркая кнопка с контуром .buttonBorderShape(.capsule) // Закругленная форма
Кнопка в SwiftUI: стили, настройки и лучшие практики

Доступные варианты .buttonStyle:

  • .automatic — стиль по умолчанию, который SwiftUI выбирает автоматически в зависимости от платформы и контекста.
  • .borderless — кнопка без границ, часто используется в списках или текстовых кнопках.
  • .bordered — стандартная кнопка с рамкой, подходящая для обычных действий.
  • .borderedProminent — яркая кнопка с акцентной заливкой, идеально подходит для ключевых действий (например, кнопка «Купить»).

Формы .buttonBorderShape:

  • .automatic - SwiftUI автоматически выбирает форму границы, соответствующую контексту.
  • .capsule - закругленная кнопка в виде капсулы, часто используется для главных действий.
  • .circle - кнопка в форме круга, удобна для иконок или действий, например, кнопка «+» для добавления.
  • .roundedRectangle(radius:) - прямоугольная кнопка со скругленными углами, где можно задать радиус скругления вручную.

🎭 Роли кнопок (Button Roles)

SwiftUI позволяет обозначать роль кнопки, чтобы система автоматически применяла стилистические особенности:

Button("Удалить", role: .destructive) { print("Удаление данных") }
Кнопка в SwiftUI: стили, настройки и лучшие практики

Доступные роли:

  • .destructive — красная кнопка для критических действий
  • .cancel — кнопка отмены

✨ Создание кастомного стиля кнопки

Если стандартные стили вам не подходят, можно создать свой:

Кнопка в SwiftUI: стили, настройки и лучшие практики

Применение стиля:

Button("Продолжить") { print("Кнопка нажата!") } .buttonStyle(PrimaryButtonStyle())
Кнопка в SwiftUI: стили, настройки и лучшие практики

Чтобы добавить автодополнение в Xcode, можно расширить ButtonStyle:

extension ButtonStyle where Self == PrimaryButtonStyle { static var primary: PrimaryButtonStyle { .init() } }
Кнопка в SwiftUI: стили, настройки и лучшие практики

Теперь стиль можно применять так:

Button("Продолжить") { print("Кнопка нажата!") } .buttonStyle(.primary)
Кнопка в SwiftUI: стили, настройки и лучшие практики

✅ Лучшие практики при работе с кнопками в SwiftUI

🔹 Используйте Button, а не TapGesture, чтобы автоматически поддерживать доступность.

🔹 Применяйте системные стили (.borderedProminent, .capsule) для лучшего UI/UX.

🔹 Роли кнопок (.destructive, .cancel) делают интерфейс интуитивно понятным.

🔹 Создавайте переиспользуемые стили кнопок через ButtonStyle.

🔹 Избегайте избыточных эффектов, если это не улучшает пользовательский опыт.

🔥 Заключение

SwiftUI предоставляет мощные инструменты для работы с кнопками — от простых стандартных вариантов до полностью кастомных стилей и взаимодействий. Используйте встроенные API, создавайте переиспользуемые компоненты и следуйте лучшим практикам, чтобы сделать интерфейс удобным и интуитивным.

1
Начать дискуссию