ViewBoundContextMenu

1.1.0

A SwiftUI wrapper view that supports context menus in SwiftUI List rows.
MrAsterisco/ViewBoundContextMenu

What's New

v1.1.0

2022-09-22T08:42:23Z

New Features

  • ContextAction now has a children property that allows to build submenus. Submenus are supported on all platforms.

ViewBoundContextMenu

ViewBoundContextMenu is a SwiftUI component that implements context menus that apply only to the view that defines them. While this should also be the case for SwiftUI's contextMenu view modifier, it doesn't work in views inside List: in this situation, the context menu is applied to the entire row.

This problem has been reported multiple times. Here are some examples:

The current workaround is to remove List and replace it with a VStack (or a LazyVStack) and a ScrollView. This solution isn't ideal, because List provides a different experience and supports additional interactions (such as swipe actions).

ViewBoundContextMenu solves this problem!

Installation

ViewBoundContextMenu is available through Swift Package Manager.

.package(url: "https://github.com/MrAsterisco/ViewBoundContextMenu", from: "<see GitHub releases>")

Latest Release

To find out the latest version, look at the Releases tab of this repository.

Usage

ViewBoundContextMenu is exposed as a ViewModifier that you can apply to any view:

Text("Left Label")
  .bold()
  .viewBoundContextMenu {
    [
      .init(
        identifier: "Unique Identifier",
        title: "Action Title",
        image: nil, // Optional,
        children: [] // Optional,
        action: { // Do something } // Passing `nil` will disable the menu item
      )
    ]
  }

The content of the menu is defined by an array of ContextAction:

struct ContextAction {
  let identifier: String
  let title: String
  let image: UImage?|NSImage? // Optional: images will not be displayed when running on Mac Catalyst.
  let action: () -> ()
  let children: [ContextAction] // Actions in this array will be displayed as submenu items.
}

Example App

To see ViewBoundContextMenu in action, you can open the ViewBoundContextMenu workspace and run the "ViewBoundContextMenuExample" app.

Compatibility

ViewBoundContextMenu is compatible with iOS, macOS, and Mac Catalyst.

ViewBoundContextMenu targets iOS 13.0 or later and macOS 10.15 or later. The following dependencies are required:

  • SwiftUIX version 0.1.2.

Contributions

All contributions to expand the library are welcome. Fork the repo, make the changes you want, and open a Pull Request.

If you make changes to the codebase, I am not enforcing a coding style, but I may ask you to make changes based on how the rest of the library is made.

Status

This library is under active development. It is used in one app in Production (running on iOS and Mac Catalyst).

Even if most of the APIs are pretty straightforward, they may change in the future; but you don't have to worry about that, because releases will follow Semanting Versioning 2.0.0.

License

RxFireAuth is distributed under the MIT license. See LICENSE for details.

Description

  • Swift Tools 5.7.0
View More Packages from this Author

Dependencies

Last updated: Mon Dec 02 2024 03:05:19 GMT-1000 (Hawaii-Aleutian Standard Time)