Site icon AppTractor

Создание настраиваемого сегментированного контрола в SwiftUI

Сегментированные элементы управления — распространенный элемент пользовательского интерфейса в приложениях для iOS, позволяющий пользователям переключаться между различными видами или опциями. Хотя SwiftUI предоставляет встроенный Picker в сегментированном стиле, создание собственного сегментированного контрола может обеспечить большую гибкость в дизайне и функциональности. В этой статье мы рассмотрим, как создать собственный сегментированный контрол в SwiftUI, черпая вдохновение из моей реализации его в приложении Catzumi.

Реализация кода

Давайте погрузимся в код для нашего пользовательского SegmentedControl:

import SwiftUI

struct SegmentedControl: View {
    
    // MARK: - Properties
    
    @Binding var selection: Int
    var options: [String]
    
    // MARK: - Properties (Private)
    
    @StateObject private var themeManager = ThemeManager()
    
    // MARK: - Properties (Views)
    
    var body: some View {
        HStack(spacing: 0) {
            ForEach(options.indices, id: \.self) { index in
                Text(options[index])
                    .frame(maxWidth: .infinity)
                    .padding(8)
                    .apply { view in
                        if index == selection {
                            view
                                .foregroundStyle(themeManager.backgroundButton)
                                .background {
                                    Rectangle()
                                        .foregroundStyle(themeManager.foregroundButton)
                                }
                        } else {
                            view
                                .foregroundStyle(themeManager.foregroundButton)
                                .background {
                                    Rectangle()
                                        .foregroundStyle(themeManager.backgroundButton)
                                }
                        }
                    }
                    .onTapGesture {
                        UIImpactFeedbackGenerator(style: .light).impactOccurred()
                        withAnimation(.linear(duration: 0.1)) { selection = index }
                    }
            }
        }
        .padding(8)
        .border(themeManager.foregroundButton, width: 4)
    }
    
}

В этой реализации есть несколько ключевых моментов:

Использование

Вот как вы можете реализовать пользовательский SegmentedControl в вашем представлении:

import SwiftUI

struct ShopView: View {
    
    // MARK: - Properties (Private)
    
    @State private var section = 0
    
    // MARK: - Properties (View)
    
    var body: some View {
        ZStack {
            VStack(spacing: 0) {
                SegmentedControl(selection: $section, options: ["Cat", "Interface", "My Items"])
                    .padding()
                if section == 0 {
                    // ...
                } else if section == 1 {
                    // ...
                } else if section == 2 {
                    // ...
                }
            }
        }
    }

}

В этом примере от Catzumi мы создали ShopView, который использует наш пользовательский SegmentedControl для переключения между различными разделами магазина.

Усовершенствования

Чтобы еще больше улучшить сегментированный элемент управления, рассмотрим следующие дополнения:

Заключение

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

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

Источник

Exit mobile version