- August 12, 2025
- Mins Read
A simple cross-platform toolbar/custom input accessory view library for iOS & macOS.
Written in Swift.
š”Ā Try:Ā Includes an iOS & macOS demo.
Supports push buttonsāa segmented item’s subitems become push buttons.
iOS 13:Ā actionĀ items use the newĀ context menu interaction:
Note:Ā Due to an internal assertion, the keyboard can no longer remain visible during the interaction.
- Supports push,Ā action, & segmented control toolbar items.
- ProvidesĀ
NSMenuItem
s for each item.Requirements
- iOS 10.0+ (12.0+ for dark mode)
- macOS 10.12+ (10.13+ for full functionality)
github “chriszielinski/Ribbon”
pod “Ribbon”
There are two ways of integratingĀ Ribbon
Ā into your project:
š„ The recommended approach.
The configuration file makes for a quick & easy integration. The default configuration filename isĀ ribbon-configuration.json
Ā and should be copied into the target’s bundle resources (in theĀ Copy Bundle ResourcesĀ build phase).
The JSON below defines a single action item and toolbar configurationāwhich is only relevant for the macOS platform.
š§Ā See:Ā Demos/Shared/ribbon-configuration.jsonĀ for a more comprehensive example.
{
“items”: [
{
“action”: “actionItemHandler”,
“controlKind”: “action”,
“identifier”: “action-item-identifier”,
“imageName”: “NSActionTemplate”,
“keyEquivalent”: “a”,
“keyEquivalentModifier”: [“command”, “shift”],
“title”: “Action Item”,
“toolTip”: “The action button’s tool-tip.”,
“subitems”: [
{
“action”: “firstActionSubitemHandler”,
“identifier”: “first-action-subitem”,
“imageName”: “hand.thumbsup”,
“keyEquivalent”: “1”,
“keyEquivalentModifier”: [“command”],
“title”: “First Action Subitem”,
“toolTip”: “The first action’s tool-tip.”
},
{
“action”: “secondActionSubitemHandler”,
“identifier”: “second-action-subitem”,
“imageName”: “hand.thumbsdown”,
“keyEquivalent”: “2”,
“keyEquivalentModifier”: [“command”],
“title”: “Second Action Subitem”,
“toolTip”: “The second action’s tool-tip.”
}
]
}
],
“toolbar”: {
“displayMode”: “iconOnly”,
“sizeMode”: “regular”,
“identifier”: “toolbar-identifier”,
“defaultItems” : [“NSToolbarFlexibleSpaceItem”, “action-item-identifier”]
}
}
Integration into your view controller is as simple as:
šĀ Note:Ā The code below is an abstraction andĀ will notĀ compile.
import Ribbon
class YourViewController … {
…
var ribbon: Ribbon!
override func viewDidLoad() {
ribbon = try! Ribbon.loadFromMainBundle(target: self)
#if canImport(UIKit)
textView.inputAccessoryView = ribbon
#endif
}
#if canImport(AppKit)
override func viewWillAppear() {
view.window?.toolbar = ribbon.toolbar
super.viewWillAppear()
}
#endif
@objc
func actionItemHandler() { }
@objc
func firstActionSubitemHandler() { }
@objc
func secondActionSubitemHandler() { }
}
šĀ Note:Ā The code below is an abstraction andĀ will notĀ compile.
import Ribbon
class YourViewController … {
…
var ribbon: Ribbon!
override func viewDidLoad() {
let firstActionSubitem = RibbonItem(subItemTitle: “First Action Subitem”)
firstActionSubitem.action = #selector(firstActionSubitemHandler)
let secondActionSubitem = RibbonItem(subItemTitle: “Second Action Subitem”)
secondActionSubitem.action = #selector(secondActionSubitemHandler)
let actionItem = RibbonItem(controlKind: .action,
title: “Action Item”,
subitems: [firstActionSubitem, secondActionSubitem])
actionItem.action = #selector(actionItemHandler)
ribbon = Ribbon(items: [actionItem], target: self)
#if canImport(UIKit)
textView.inputAccessoryView = ribbon
#endif
}
#if canImport(AppKit)
override func viewWillAppear() {
view.window?.toolbar = ribbon.toolbar
super.viewWillAppear()
}
#endif
@objc
func actionItemHandler() { }
@objc
func firstActionSubitemHandler() { }
@objc
func secondActionSubitemHandler() { }
}
UIKeyCommand
.RFKeyboardToolbar
.Ribbon
Ā depends on the wonderful contributions of the Swift community, namely:
Recognize your user's voice elegantly without having to figure out authorization and audio engines. SwiftSpeech Examples Features Installation Getting Started ...
Example To run the example project, clone the repo, and runĀ pod installĀ from the Example directory first. Requirements iOS 14.0 Installation ...
SlidingRulerĀ is a Swift package containing a SwiftUI control that acts like an linear infinite slider or a finite, more precise ...
SkeletonUI aims to bring an elegant, declarative syntax to skeleton loading animations. Get rid of loading screens or spinners and ...