Как изменить цвет текста и фона UIMenu | UIAction (Swift 5)
Подскажите пожалуйста, как настроить это меню? Может быть, другой способ сделать это?
let barMenu = UIMenu(title: "", children: [
UIAction(title: NSLocalizedString("menu_item_home", comment: "")){
action in
print("menu_item_home 1")
},
UIAction(title: NSLocalizedString("menu_item_settings", comment: "")){
action in
print("menu_item_settings 2")
let settingsStoryboard = UIStoryboard(name: "Settings", bundle: nil)
let settingsController = settingsStoryboard.instantiateViewController(withIdentifier: "SettingsScene") as! SettingsViewController
controller.navigationController?.pushViewController(settingsController, animated: true)
},
UIAction(title: NSLocalizedString("menu_item_contacts", comment: "")){
action in
print("menu_item_contacts 3")
},
])
let navBarMenu = UIBarButtonItem(image: UIImage(systemName: "text.justify"), menu: barMenu)
navigationItem.rightBarButtonItem = navBarMenu
Мне нужно добавить меню в панель навигации и настроить его внешний вид. Укажите в правильном направлении, пожалуйста
1 ответ
К сожалениюUIMenu
не являетсяUIView
и есть очень мало возможностей для его настройки. Невозможно изменить цвет фона или текста, по крайней мере, в текущей iOS 15 и, по крайней мере, без каких-либо глупых обходных путей. Если вам нужно, чтобы это меню выглядело по-другому, возможно, вы можете создать что-то подобное с помощью пользовательского всплывающего окна вместо использования UIMenu. Это дало бы вам гораздо больше возможностей для настройки. Не совсем то, что вы просили, но, возможно, это будет соответствовать вашим потребностям. Возможная реализация подобного меню на основе всплывающего окна может выглядеть примерно так, как показано ниже:
class MenuViewController: UITableViewController, UIPopoverPresentationControllerDelegate {
private var actions: [UIAction] = [] // or perhaps something custom
convenience init(actions: [UIAction]) {
self.init(style: .plain)
self.actions = actions
modalPresentationStyle = .popover
preferredContentSize = CGSize(width: 240, height: 40 * actions.count)
presentationController?.delegate = self
popoverPresentationController?.permittedArrowDirections = .up
}
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: "UITableViewCell")
tableView.rowHeight = 40
tableView.separatorInset = .zero
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return actions.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell", for: indexPath)
let action = actions[indexPath.row]
cell.textLabel?.text = action.title
cell.imageView?.image = action.image
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// do something
}
func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
return .none
}
}
А затем представить его где-нибудь из вашего кода следующим образом:
let menuVC = MenuViewController(actions: [
// actions
])
menuVC.popoverPresentationController?.sourceView = mySourceView
menuVC.popoverPresentationController?.sourceRect = mySourceView.bounds
present(menuVC, animated: true, completion: nil)