iOS, UIMenu

iDOยท2021๋…„ 12์›” 3์ผ

iOS

๋ชฉ๋ก ๋ณด๊ธฐ
5/8
post-thumbnail

๐Ÿง UIMenu๋ฅผ ๋งŒ๋“ค์–ด๋ณผ๊ฑฐ์—์š”!

โ›„๏ธ ํ…Œ์ด๋ธ” ๋ทฐ์— ์ ์šฉํ•˜๊ธฐ(iOS 13.0 โ†‘)

Step 1

UIAction ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  UIMenu๋ฅผ ์ƒ์„ฑํ•˜์—ฌ children ํŒŒ๋ผ๋ฏธํ„ฐ์— ์ƒ์„ฑํ•œ UIAction ๋ฐฐ์—ด์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

โ›„๏ธ ViewController.swift

class ViewController: UIViewController {
    private lazy var menuItems: [UIAction] = {
        return [
            UIAction(
                title: "Hello World!",
                image: UIImage(systemName: "figure.wave"),
                handler: { _ in
                    print("Hello World!")
                }),
            UIAction(
                title: "Morning World!",
                image: UIImage(systemName: "cloud.sun.fill"),
                handler: { _ in
                    print("Moring World!")
                }),
            UIAction(
                title: "Night World!",
                image: UIImage(systemName: "moon.stars.fill"),
                handler: { _ in
                    print("Night World!")
                })
        ]
    }()
    
    private lazy var menu: UIMenu = {
        return UIMenu(title: "", options: [], children: menuItems)
    }()
    ...
}
Step 2

TableView๋ฅผ ์ƒ์„ฑํ•ด์ฃผ์„ธ์š”. ๊ทธ ๋‹ค์Œ, tableView(_:contextMenuConfigurationForRowAt:point:) ๋ฉ”์†Œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค.

Step 3

์œ„์—์„œ ์ƒ์„ฑํ•œ ๋ฉ”์†Œ๋“œ์—์„œ UIContextMenuConfiguration๋ฅผ ๋ฆฌํ„ด๋ฐ›์•„์•ผํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” identifier์™€ previewProvider๋Š” ์—†์ด ๋งŒ๋“ค๊ฑฐ๋ผ nil๊ฐ’์„ ์ฃผ๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค.

โ›„๏ธ ViewController.swift

...

extension ViewController: UITableViewDataSource, UITableViewDelegate {
...
    func tableView(_ tableView: UITableView, contextMenuConfigurationForRowAt indexPath: IndexPath, point: CGPoint) -> UIContextMenuConfiguration? {
        return UIContextMenuConfiguration(identifier: nil,
                                          previewProvider: nil,
                                          actionProvider: {_ in
            return self.menu
        })
    }
}

โ›„๏ธ ๊ฒฐ๊ณผ!

โ›„๏ธ ๋ฒ„ํŠผ์— ์ ์šฉํ•˜๊ธฐ(iOS 14.0 โ†‘)

Step 1

๋ฒ„ํŠผ์— ๋ฉ”๋‰ด๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ์€ ํ…Œ์ด๋ธ” ๋ทฐ์— ์ ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์šฐ์„  button: UIButton์„ ๋งŒ๋“ค์–ด์ฃผ์‹œ๊ณ  viewDidLoad์— button.menu = menu(ํ…Œ์ด๋ธ” ๋ทฐ์— ์ ์šฉํ•˜๊ธฐ Step 1์—์„œ ๋งŒ๋“  menu์ž…๋‹ˆ๋‹ค.)๋ฅผ ์ถ”๊ฐ€ํ•ด์ค๋‹ˆ๋‹ค.

โ›„๏ธ ViewController.swift

class ViewController: UIViewController {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        button.menu = menu
    }
}
...
Step 2

์—ฌ๊ธฐ๊นŒ์ง€๋งŒํ•ด๋„ ์™„์„ฑ์ด์ง€๋งŒ, ๋ฒ„ํŠผ์„ ์งง๊ฒŒ ๋ˆŒ๋ €์„ ๋•Œ ๋ฐ”๋กœ ๋ฉ”๋‰ด๋ฅผ ๋ณด์ด๊ฒŒ ํ•˜๊ธฐ์œ„ํ•ด์„œ๋Š” viewDidLoad์— button.showsMenuAsPrimaryAction = true ๋ฅผ ์ถ”๊ฐ€ํ•ด์ค์‹œ๋‹ค.

โ›„๏ธ ViewController.swift

class ViewController: UIViewController {
    ...
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.delegate = self
        tableView.dataSource = self
        button.menu = menu
        button.showsMenuAsPrimaryAction = true
    }
}
...

โ›„๏ธ ๊ฒฐ๊ณผ!

๐Ÿง(์•„๋ž˜ ์ฐธ๊ณ ๋‚ด์šฉ์„ ํ†ตํ•ด ๋” ์ž์„ธํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!)
Apple Developer

profile
์ด๊ณณ์€ ์ €๋ฅผ ์œ„ํ•œ iOS ์„ค๋ช…์„œ์ž…๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€