Поддержка разных фигур в ButtonStyle - PullRequest
0 голосов
/ 19 января 2020

Я создаю Button с пользовательским ButtonStyle. Мне бы хотелось, чтобы этот стиль кнопок поддерживал два разных «появления» - прямоугольник с закругленными углами. Для этого я определил перечисление для вариантов внешнего вида и передаю его в ButtonStyle, чтобы он мог изменять свои свойства по мере необходимости. Я столкнулся с проблемой, и я пытаюсь предоставить разные Shape s clipShape(). Есть ошибка времени компиляции, когда я возвращаю Shape:

Функция объявляет непрозрачный тип возврата, но операторы возврата в своем теле не имеют соответствующих базовых типов

Какой хороший подход для устранения этой ошибки и реализации нужного появления кнопок?

struct FloatingButton: View {
    enum FloatingButtonStyleType {
        case circle
        case roundedRectangle
    }

    private let image: Image
    private let style: FloatingButtonStyleType
    private let action: () -> ()

    var body: some View {
        Button(action: action) {
            image
        }
        .buttonStyle(FloatingButtonStyle(style: style))
    }

    init(image: Image, style: FloatingButtonStyleType, action: @escaping () -> ()) {
        self.image = image
        self.style = style
        self.action = action
    }
}

struct FloatingButtonStyle: ButtonStyle {
    let style: FloatingButton.FloatingButtonStyleType

    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .padding(.all, 10)
            .background(Color.black)
            .clipShape(clipShape())
    }

    private func clipShape() -> some Shape { //FIXME: Function declares an opaque return type, but the return statements in its body do not have matching underlying types
        switch style {
        case .circle:
            return Circle()
        case .roundedRectangle:
            return RoundedRectangle(cornerRadius: 5, style: .continuous)
        }
    }
}

1 Ответ

0 голосов
/ 19 января 2020

Здесь возможен подход (скомпилировано и обработано, протестировано с Xcode 11.2 / iOS 13.2)

struct FloatingButtonStyle: ButtonStyle {
    let style: FloatingButton.FloatingButtonStyleType

    struct StyleModifier : ViewModifier {
        let style: FloatingButton.FloatingButtonStyleType

        func body(content: Self.Content) -> AnyView {
            switch style {
            case .circle:
                return AnyView(content.clipShape(Circle()))
            case .roundedRectangle:
                return AnyView(content.clipShape(RoundedRectangle(cornerRadius: 5, 
                               style: .continuous)))
            }
        }
    }

    func makeBody(configuration: Self.Configuration) -> some View {
        configuration.label
            .padding(.all, 10)
            .background(Color.black)
            .modifier(StyleModifier(style: style))
    }

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