Custom alert: show menu when long press moves onto menu button
This commit is contained in:
parent
5abd265195
commit
d1af911241
|
@ -159,6 +159,7 @@ class CustomAlertActionsView: UIControl {
|
|||
}()
|
||||
#endif
|
||||
private var currentSelectedActionIndex: Int?
|
||||
private var showPressedMenuWorkItem: DispatchWorkItem?
|
||||
|
||||
init(config: CustomAlertController.Configuration, dismiss: @escaping () -> Void) {
|
||||
self.dismiss = dismiss
|
||||
|
@ -327,11 +328,34 @@ class CustomAlertActionsView: UIControl {
|
|||
generator.selectionChanged()
|
||||
}
|
||||
#endif
|
||||
|
||||
if let showPressedMenuWorkItem {
|
||||
showPressedMenuWorkItem.cancel()
|
||||
self.showPressedMenuWorkItem = nil
|
||||
}
|
||||
}
|
||||
|
||||
currentSelectedActionIndex = selectedButton?.offset
|
||||
selectedButton?.element.backgroundColor = .secondarySystemFill
|
||||
|
||||
if let currentSelectedActionIndex,
|
||||
case .menu(_) = reorderedActions[currentSelectedActionIndex].style,
|
||||
case let button = actionButtons[currentSelectedActionIndex],
|
||||
let interaction = button.contextMenuInteraction,
|
||||
showPressedMenuWorkItem == nil {
|
||||
showPressedMenuWorkItem = DispatchWorkItem {
|
||||
if #available(iOS 17.4, *) {
|
||||
button.performPrimaryAction()
|
||||
} else {
|
||||
let selector = NSSelectorFromString(["Location:", "At", "Menu", "present", "_"].reversed().joined())
|
||||
if interaction.responds(to: selector) {
|
||||
interaction.perform(selector, with: recognizer.location(in: button))
|
||||
}
|
||||
}
|
||||
}
|
||||
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(250), execute: showPressedMenuWorkItem!)
|
||||
}
|
||||
|
||||
#if !os(visionOS)
|
||||
generator.prepare()
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue