Есть ли в iOS 13 - UIMenu ошибка, из-за которой не отображается изображение?
Вставьте в проект следующий код:
Рядом с надписью "Device Honey" не отображается изображение, т.е. UIMenu
Однако изображение появляется рядом с "Копировать", т.е. UIACtion
.
Я делаю что-то неправильно? Если это ошибка? Есть ли обходной путь?
class ViewController: UIViewController {
let tableview: UITableView = {
let tv = UITableView()
tv.frame = UIScreen.main.bounds
return tv
}()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(tableview)
tableview.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
tableview.delegate = self
tableview.dataSource = self
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 1
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
if cell.detailTextLabel == nil {
cell = UITableViewCell(style: .value1, reuseIdentifier: "cell")
}
cell.textLabel?.text = "Honey"
cell.detailTextLabel?.text = "iOS developer"
return cell
}
@available(iOS 13.0, *)
func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
return UIContextMenuConfiguration(identifier: nil, previewProvider: nil, actionProvider: { suggestedActions in
return self.makeContextMenu(for: indexPath)
})
}
@available(iOS 13.0, *)
func makeContextMenu(for indexPath: IndexPath) -> UIMenu? {
let copyAction = UIAction(title: "Copy", image: UIImage(systemName: "square.and.arrow.up")) { [weak self] _ in
guard let self = self else { return }
let cell = self.tableview.cellForRow(at: indexPath)
let pasteboard = UIPasteboard.general
pasteboard.string = cell?.detailTextLabel?.text
}
guard let cell = self.tableview.cellForRow(at: indexPath), let title = cell.textLabel?.text else { return nil}
return UIMenu(title: "Device \(title) ", image: UIImage(systemName: "square.and.arrow.up"), children: [copyAction])
}
}
В демонстрации Apple WWDC они могут сделать это, как показано ниже:
3 ответа
Контекстное меню состоит из двух частей: предварительного просмотра и меню. Оба варианта не обязательны. "Продукты" на скриншоте Apple - это предварительный просмотр, а не меню. По умолчанию создается снимок ячейки, и снимок отображается в качестве предварительного просмотра. Само меню на скриншоте Apple не имеет изображения и заголовка. И вы тоже должны это сделать! Последняя строка
return UIMenu(...
... не должен иметь названия и изображения. Это меню, которое включает все остальное и которое возвращается, является меню верхнего уровня и отображается по-другому (как показано на вашем собственном снимке экрана). Лучше всего он выглядит без заголовка и вообще не может отображать изображение. Его задача - обернуть все остальное и предоставить идентификатор, и все.
Тогда вы получите что-то вроде этого:
Это более важный комментарий
Предварительный просмотр, который вы показываете в своем вопросе, ужасно вводит в заблуждение. Похоже на остальные пункты меню. Тем не менее, раздел "Продовольственные товары" на вашем скриншоте - это предварительный просмотр. Гораздо более характерный предварительный просмотр будет примерно таким:
У меня тот же вопрос, в документации по UIMenu init(title:image:identifier:options:children:) указан параметр изображения:
image: изображение, отображаемое рядом с заголовком меню.
Похоже, он предназначен для использования в подменю, как показано в этом блоге: Полное руководство по UIMenu .