iOS 14 настраивает меню UIBarButttonItem перед его открытием
Поскольку iOS14 предлагает простой способ настройки меню на UIBarButtonItem
, Интересно, не скучаю ли я, что нет простого способа настроить его элементы, поскольку они могут зависеть от текущего контекста.
Я вижу что есть UIDeferredMenuElement
, но это не похоже на хороший вариант использования?
Также я вижу, что есть primaryAction
, но, похоже, нет тривиального способа вызвать меню оттуда.
И третий вариант, кажется, перетасовывает меню при каждом изменении, которое может повлиять на него, но это не кажется хорошей идеей.
Я предполагаю, что я что-то упускаю.
2 ответа
Как правило, для простых кнопок на панели такого положения нет. UIControl, как UIButton, имеет событие.menuActionTriggered
, и в этот момент вполне разумно создать и назначить меню элементу управления, тем самым реализовав динамическое меню, которое создается непосредственно перед появлением меню.
Но вы не можете сделать это с помощью элемента кнопки панели - если это не пользовательский элемент кнопки панели просмотра с UIButton в нем.
В противном случае вам пришлось бы наблюдать за окружающими условиями с помощью какого-либо другого механизма и просто менять меню элемента панели каждый раз, когда условия меняются. Звучит как заноза в заднице, но, вероятно, это ваш единственный вариант. (Насколько я понимаю, именно это вы имеете в виду, когда говорите: "И третий вариант, кажется, перетасовывает меню при каждом изменении, которое может повлиять на него, но это не кажется хорошей идеей".)
Я думаю, что то, о чем вы просите, разумно, и кажется глупым, что для этого нет возможности; Если у вас есть хороший вариант использования, я бы рекомендовал подать запрос на улучшение в Apple.
Вот версия реализации Swift 5, вдохновленная ответом @matt.
private func setButton() {
button.menu = UIMenu() // Here must be a placeholder menu. As the menu won't show if button.menu is nil.
button.showsMenuAsPrimaryAction = true
button.addTarget(self, action: #selector(createMenu(_:)), for: .menuActionTriggered)
}
@objc private func createMenu(_ button:UIButton) {
...
}
На данный момент это единственное решение. В виде
func pressesBegan(_ presses: Set<UIPress>, with event: UIPressesEvent?)
не вызывается каждый раз, если вы не удерживаете какое-то время, когда кнопка установлена на
showsMenuAsPrimaryAction = true
.