Fix visibility/local-only buttons not appearing on Catalyst
You need to pass the configuration to the initializer to get it to show up in the Mac idiom Fixes #452
This commit is contained in:
parent
28c1a9092b
commit
e8ef9345e9
|
@ -54,14 +54,20 @@ class ToolbarController: ViewController {
|
||||||
cwButton
|
cwButton
|
||||||
|
|
||||||
MenuPicker(selection: visibilityBinding, options: visibilityOptions, buttonStyle: .iconOnly)
|
MenuPicker(selection: visibilityBinding, options: visibilityOptions, buttonStyle: .iconOnly)
|
||||||
// the button has a bunch of extra space by default, but combined with what we add it's too much
|
#if !targetEnvironment(macCatalyst)
|
||||||
|
// the button has a bunch of extra space by default, but combined with what we add it's too much
|
||||||
.padding(.horizontal, -8)
|
.padding(.horizontal, -8)
|
||||||
|
#endif
|
||||||
.disabled(draft.editedStatusID != nil)
|
.disabled(draft.editedStatusID != nil)
|
||||||
.disabled(composeController.mastodonController.instanceFeatures.localOnlyPostsVisibility && draft.localOnly)
|
.disabled(composeController.mastodonController.instanceFeatures.localOnlyPostsVisibility && draft.localOnly)
|
||||||
|
|
||||||
if composeController.mastodonController.instanceFeatures.localOnlyPosts {
|
if composeController.mastodonController.instanceFeatures.localOnlyPosts {
|
||||||
localOnlyPicker
|
localOnlyPicker
|
||||||
|
#if targetEnvironment(macCatalyst)
|
||||||
|
.padding(.leading, 4)
|
||||||
|
#else
|
||||||
.padding(.horizontal, -8)
|
.padding(.horizontal, -8)
|
||||||
|
#endif
|
||||||
.disabled(draft.editedStatusID != nil)
|
.disabled(draft.editedStatusID != nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -26,13 +26,26 @@ public struct MenuPicker<Value: Hashable>: UIViewRepresentable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public func makeUIView(context: Context) -> UIButton {
|
public func makeUIView(context: Context) -> UIButton {
|
||||||
let button = UIButton()
|
let button = UIButton(configuration: makeConfiguration())
|
||||||
button.showsMenuAsPrimaryAction = true
|
button.showsMenuAsPrimaryAction = true
|
||||||
button.setContentHuggingPriority(.required, for: .horizontal)
|
button.setContentHuggingPriority(.required, for: .horizontal)
|
||||||
return button
|
return button
|
||||||
}
|
}
|
||||||
|
|
||||||
public func updateUIView(_ button: UIButton, context: Context) {
|
public func updateUIView(_ button: UIButton, context: Context) {
|
||||||
|
button.configuration = makeConfiguration()
|
||||||
|
button.menu = UIMenu(children: options.map { opt in
|
||||||
|
let action = UIAction(title: opt.title, subtitle: opt.subtitle, image: opt.image, state: opt.value == selection ? .on : .off) { _ in
|
||||||
|
selection = opt.value
|
||||||
|
}
|
||||||
|
action.accessibilityLabel = opt.accessibilityLabel
|
||||||
|
return action
|
||||||
|
})
|
||||||
|
button.accessibilityLabel = selectedOption.accessibilityLabel ?? selectedOption.title
|
||||||
|
button.isPointerInteractionEnabled = buttonStyle == .iconOnly
|
||||||
|
}
|
||||||
|
|
||||||
|
private func makeConfiguration() -> UIButton.Configuration {
|
||||||
var config = UIButton.Configuration.borderless()
|
var config = UIButton.Configuration.borderless()
|
||||||
if #available(iOS 16.0, *) {
|
if #available(iOS 16.0, *) {
|
||||||
config.indicator = .popup
|
config.indicator = .popup
|
||||||
|
@ -43,16 +56,10 @@ public struct MenuPicker<Value: Hashable>: UIViewRepresentable {
|
||||||
if buttonStyle.hasLabel {
|
if buttonStyle.hasLabel {
|
||||||
config.title = selectedOption.title
|
config.title = selectedOption.title
|
||||||
}
|
}
|
||||||
button.configuration = config
|
#if targetEnvironment(macCatalyst)
|
||||||
button.menu = UIMenu(children: options.map { opt in
|
config.macIdiomStyle = .bordered
|
||||||
let action = UIAction(title: opt.title, subtitle: opt.subtitle, image: opt.image, state: opt.value == selection ? .on : .off) { _ in
|
#endif
|
||||||
selection = opt.value
|
return config
|
||||||
}
|
|
||||||
action.accessibilityLabel = opt.accessibilityLabel
|
|
||||||
return action
|
|
||||||
})
|
|
||||||
button.accessibilityLabel = selectedOption.accessibilityLabel ?? selectedOption.title
|
|
||||||
button.isPointerInteractionEnabled = buttonStyle == .iconOnly
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct Option {
|
public struct Option {
|
||||||
|
|
Loading…
Reference in New Issue