Как установить пользовательское подсвеченное состояние кнопки SwiftUI - PullRequest
3 голосов
/ 08 июня 2019

У меня есть кнопка. Я хочу установить собственный цвет фона для выделенного состояния. Как я могу сделать это в SwiftUI?

enter image description here

Button(action: signIn) {
    Text("Sign In")
}
.padding(.all)
.background(Color.red)
.cornerRadius(16)
.foregroundColor(.white)
.font(Font.body.bold())

Ответы [ 2 ]

3 голосов
/ 09 июня 2019

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

struct HoverButton<Label>: View where Label: View {

    private let action: () -> ()

    private let label: () -> Label

    init(action: @escaping () -> (), label: @escaping () -> Label) {
        self.action = action
        self.label = label
    }

    @State private var pressed: Bool = false

    var body: some View {
        Button(action: action) {
            label()
                .foregroundColor(pressed ? .red : .blue)
                .gesture(DragGesture(minimumDistance: 0.0)
                    .onChanged { _ in self.pressed = true }
                    .onEnded { _ in self.pressed = false })
        }    
    }
}
2 голосов
/ 11 июля 2019

SwiftUI на самом деле предоставляет API для этого: ButtonStyle.

struct MyButtonStyle : ButtonStyle {
    func body(configuration: Button<Self.Label>, isPressed: Bool) -> some View {
        configuration
            .overlay(configuration) // Works around SwiftUI automatically changing opacity.
            .padding()
            .foregroundColor(.white)
            .background(isPressed ? Color.red : Color.blue)
            .cornerRadius(8.0)
    }
}

extension StaticMember where Base: ButtonStyle {
    static var myStyle: StaticMember<MyButtonStyle> {
        return .init(MyButtonStyle())
    }
}

// to use it
Button(action: {}) {
  Text("Hello World")
}
.buttonStyle(.myStyle)

Как я заметил в комментарии после .overlay(...), в настоящее время (бета-версия 3) SwiftUI всегда изменяетсяНепрозрачность содержимого кнопки автоматически.Я оставил отзыв об этом, поскольку кажется, что использование пользовательского стиля кнопки должно полностью перекрывать такое поведение.Для меня это похоже на ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...