Contents

DisclosureGroupStyle

A type that specifies the appearance and interaction of disclosure groups within a view hierarchy.

Declaration

@MainActor @preconcurrency protocol DisclosureGroupStyle

Overview

To configure the disclosure group style for a view hierarchy, use the disclosureGroupStyle(_:) modifier.

To create a custom disclosure group style, declare a type that conforms to DisclosureGroupStyle. Implement the makeBody(configuration:) method to return a view that composes the elements of the configuration that SwiftUI provides to your method.

struct MyDisclosureStyle: DisclosureGroupStyle {
    func makeBody(configuration: Configuration) -> some View {
        VStack {
            Button {
                withAnimation {
                    configuration.isExpanded.toggle()
                }
            } label: {
                HStack(alignment: .firstTextBaseline) {
                    configuration.label
                    Spacer()
                    Text(configuration.isExpanded ? "hide" : "show")
                        .foregroundColor(.accentColor)
                        .font(.caption.lowercaseSmallCaps())
                        .animation(nil, value: configuration.isExpanded)
                }
                .contentShape(Rectangle())
            }
            .buttonStyle(.plain)
            if configuration.isExpanded {
                configuration.content
            }
        }
    }
}

A type conforming to this protocol inherits @preconcurrency @MainActor isolation from the protocol if the conformance is included in the type’s base declaration:

struct MyCustomType: Transition {
    // `@preconcurrency @MainActor` isolation by default
}

Isolation to the main actor is the default, but it’s not required. Declare the conformance in an extension to opt out of main actor isolation:

extension MyCustomType: Transition {
    // `nonisolated` by default
}

Topics

Getting the styles

Creating custom disclosure group styles

Supporting types

See Also

Styling collection views