Как изменить цвет текста и фона 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)
Другие вопросы по тегам