Esri / arcgis-maps-sdk-swift-toolkit

Mapping components that will simplify your Swift app development with the ArcGIS Maps SDK for Swift.
https://developers.arcgis.com/swift
Apache License 2.0
29 stars 9 forks source link

Floor Filter uses non-standard close button #857

Open rolson opened 2 months ago

rolson commented 2 months ago

The close button in the floor filter looks like this:

image

However, with Apple's own apps, I see it often like this:

File (3)

What I've found works well for that look is this code:

            Button {
                dismiss()
            } label: {
                Image(systemName: "xmark.circle.fill")
                    .resizable()
                    .symbolRenderingMode(.hierarchical)
                    .foregroundStyle(.secondary)
                    .frame(width: 28, height: 28)
            }
            .buttonStyle(.plain)

And actually, I think we are already using that in the world scale scene view's calibration view.

You can actually create a predefined dismiss button with something like this:

struct DismissButton: View {
    enum Kind {
        case image
        case text
    }

    @Environment(\.dismiss) private var dismiss
    let kind: Kind

    init(kind: Kind = .image) {
        self.kind = kind
    }

    var body: some View {
        switch kind {
        case .image:
            Button {
                dismiss()
            } label: {
                Image(systemName: "xmark.circle.fill")
                    .resizable()
                    .symbolRenderingMode(.hierarchical)
                    .foregroundStyle(.secondary)
                    .frame(width: 28, height: 28)
            }
            .buttonStyle(.plain)
        case .text:
            Button {
                dismiss()
            } label: {
                Text("Done")
            }
        }
    }
}
yo1995 commented 2 months ago

image

Another way is to add a private SwiftUI view to use the native close button in UIKit.

Field Maps uses it, and a condensed version looks like

struct CloseButton: UIViewRepresentable {
    private let action: () -> Void
    init(action: @escaping () -> Void) { self.action = action }
    func makeUIView(context: Context) -> UIButton {
        let button = UIButton(type: .close, primaryAction: UIAction { _ in action() })
        for axis in [NSLayoutConstraint.Axis.horizontal, .vertical] {
            button.setContentCompressionResistancePriority(.required, for: axis)
            button.setContentHuggingPriority(.required, for: axis)
        }
        return button
    }
    func updateUIView(_ uiView: UIButton, context: Context) {}
}