ViewModifier — это протокол в SwiftUI, позволяющий инкапсулировать и повторно использовать набор модификаторов для View. Это своего рода "фабрика преобразований" для элементов интерфейса.
Ключевые характеристики:
struct PrimaryButtonStyle: ViewModifier {
func body(content: Content) -> some View {
content
.font(.headline)
.padding()
.background(Color.blue)
.foregroundColor(.white)
.cornerRadius(10)
}
}
// Использование:
Button("Нажми меня") { /* действие */ }
.modifier(PrimaryButtonStyle())
struct ConditionalGlow: ViewModifier {
let shouldGlow: Bool
func body(content: Content) -> some View {
content
.shadow(color: shouldGlow ? .yellow : .clear,
radius: 10,
x: 0,
y: 0)
}
}
struct AdaptivePadding: ViewModifier {
@Environment(\.sizeCategory) var sizeCategory
func body(content: Content) -> some View {
content
.padding(sizeCategory >= .accessibilityMedium ? 16 : 8)
}
}
Базовый шаблон:
struct YourModifier: ViewModifier {
// Параметры модификатора
var someParameter: Int
// Обязательный метод
func body(content: Content) -> some View {
content
// Применяемые модификаторы
.padding()
.background(Color.yellow)
// Можно добавлять логику
.opacity(someParameter > 5 ? 1.0 : 0.5)
}
}
// Extension для удобного использования
extension View {
func yourModifier(_ value: Int) -> some View {
modifier(YourModifier(someParameter: value))
}
}
struct LoadingModifier: ViewModifier {
@Binding var isLoading: Bool
func body(content: Content) -> some View {
ZStack {
content
.disabled(isLoading)
.opacity(isLoading ? 0.5 : 1.0)
if isLoading {
ProgressView()
}
}
}
}
struct SuperButtonStyle: ViewModifier {
func body(content: Content) -> some View {
content
.modifier(PrimaryButtonStyle())
.modifier(ConditionalGlow(shouldGlow: true))
}
}
struct BounceEffect: ViewModifier {
@State private var isBouncing = false
func body(content: Content) -> some View {
content
.scaleEffect(isBouncing ? 1.1 : 1.0)
.animation(
.easeInOut(duration: 0.5).repeatForever(),
value: isBouncing
)
.onAppear { isBouncing = true }
}
}
ViewModifier:
View:
Многие стандартные модификаторы реализованы через ViewModifier:
ViewModifier — это мощный механизм SwiftUI для создания переиспользуемых, композируемых преобразований View. Они позволяют инкапсулировать логику стилизации, уменьшать дублирование кода и создавать последовательный дизайн во всем приложении.