Пользовательская кнопка в списке SwiftUI - PullRequest
2 голосов
/ 02 апреля 2020

Пользовательская кнопка SwiftUI в списке

Я пытаюсь создать пользовательскую кнопку в списке SwiftUI. Я хочу, чтобы у него был синий фон с белым текстом, и, что важно, чтобы он оставался синим и при непрозрачности от go до 50%, а не по умолчанию серым.

Я пытался использовать пользовательский ButtonStyle, но когда я сделайте так, площадь нажатия кнопки уменьшится до самой метки. Если я коснусь любой другой части ячейки, цвет не изменится. Если я удалю ButtonStyle, то нажатие в любом месте ячейки сработает

Как это исправить, чтобы получить свои собственные цвета, в том числе цвет при касании, но вся ячейка все еще может быть изменена?

import SwiftUI

struct BlueButtonStyle: ButtonStyle {

  func makeBody(configuration: Self.Configuration) -> some View {
    configuration.label
        .font(.headline)
        .foregroundColor(configuration.isPressed ? Color.white.opacity(0.5) : Color.white)
        .listRowBackground(configuration.isPressed ? Color.blue.opacity(0.5) : Color.blue)
  }
}

struct ExampleView: View {

    var body: some View {
        NavigationView {
            List {
                Section {
                    Text("Info")
                }

                Section {
                    Button(action: {print("pressed")})
                    {
                        HStack {
                            Spacer()
                            Text("Save")
                            Spacer()
                        }

                    }.buttonStyle(BlueButtonStyle())
                }
            }
            .listStyle(GroupedListStyle())
            .environment(\.horizontalSizeClass, .regular)
            .navigationBarTitle(Text("Title"))
        }
    }
}

struct ExampleView_Previews: PreviewProvider {
    static var previews: some View {
        ExampleView()
    }
}

1 Ответ

0 голосов
/ 02 апреля 2020

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

Проверено с Xcode 11.4 / iOS 13.4

demo

struct BlueButtonStyle: ButtonStyle {

  func makeBody(configuration: Self.Configuration) -> some View {
    configuration.label
        .font(.headline)
        .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .center)
        .contentShape(Rectangle())
        .foregroundColor(configuration.isPressed ? Color.white.opacity(0.5) : Color.white)
        .listRowBackground(configuration.isPressed ? Color.blue.opacity(0.5) : Color.blue)
  }
}

и использованием, просто

Button(action: {print("pressed")})
{
    Text("Save")
}.buttonStyle(BlueButtonStyle())

и даже

Button("Save") { print("pressed") }
    .buttonStyle(BlueButtonStyle())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...