<!--
{
  "availability" : [
    "iOS: 16.0.0 -",
    "iPadOS: 16.0.0 -",
    "macCatalyst: 16.0.0 -",
    "macOS: 13.0.0 -",
    "visionOS: 1.0.0 -"
  ],
  "documentType" : "symbol",
  "framework" : "SwiftUI",
  "identifier" : "/documentation/SwiftUI/DisclosureGroupStyle",
  "metadataVersion" : "0.1.0",
  "role" : "Protocol",
  "symbol" : {
    "kind" : "Protocol",
    "modules" : [
      "SwiftUI"
    ],
    "preciseIdentifier" : "s:7SwiftUI20DisclosureGroupStyleP"
  },
  "title" : "DisclosureGroupStyle"
}
-->

# DisclosureGroupStyle

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

```
@MainActor @preconcurrency protocol DisclosureGroupStyle
```

## Overview

To configure the disclosure group style for a view hierarchy, use the
[`disclosureGroupStyle(_:)`](/documentation/SwiftUI/View/disclosureGroupStyle(_:)) modifier.

To create a custom disclosure group style, declare a type that conforms
to `DisclosureGroupStyle`. Implement the
[`makeBody(configuration:)`](/documentation/SwiftUI/DisclosureGroupStyle/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

[`static var automatic: AutomaticDisclosureGroupStyle`](/documentation/SwiftUI/DisclosureGroupStyle/automatic)

A disclosure group style that resolves its appearance automatically
based on the current context.

### Creating custom disclosure group styles

[`func makeBody(configuration: Self.Configuration) -> Self.Body`](/documentation/SwiftUI/DisclosureGroupStyle/makeBody(configuration:))

Creates a view that represents the body of a disclosure group.

[`struct DisclosureGroupStyleConfiguration`](/documentation/SwiftUI/DisclosureGroupStyleConfiguration)

The properties of a disclosure group instance.

[`typealias Configuration`](/documentation/SwiftUI/DisclosureGroupStyle/Configuration)

The properties of a disclosure group instance.

[`associatedtype Body : View`](/documentation/SwiftUI/DisclosureGroupStyle/Body)

A view that represents the body of a disclosure group.

### Supporting types

[`struct AutomaticDisclosureGroupStyle`](/documentation/SwiftUI/AutomaticDisclosureGroupStyle)

A disclosure group style that resolves its appearance automatically
based on the current context.

## Relationships

### Conforming Types

[`AutomaticDisclosureGroupStyle`](/documentation/SwiftUI/AutomaticDisclosureGroupStyle)

---

Copyright &copy; 2026 Apple Inc. All rights reserved. | [Terms of Use](https://www.apple.com/legal/internet-services/terms/site.html) | [Privacy Policy](https://www.apple.com/privacy/privacy-policy)