文章

针对 Mac 优化你的 iPad App

通过利用 macOS 中的系统功能,让你的 iPad App 更像一款 Mac App。

概览

你完全不用费任何力气,即可让你 iPad App 的 Mac 版本支持 macOS 中的许多系统功能,其中包括:

  • App 的默认菜单栏

  • 支持触控板、鼠标和键盘输入

  • 支持调整窗口大小和全屏显示

  • Mac 风格的滚动条

  • 拷贝和粘贴支持

  • 拖放支持

  • 支持系统触控栏控件

此外,你还可以扩展你的 App 来利用更多系统功能。

添加菜单栏项目

App 的 Mac 版本带有一个标准菜单栏。你可以通过使用 UIMenuBuilder 添加和移除菜单项,对其进行自定。要进一步了解,请参阅“向菜单栏和用户界面中添加菜单和快捷键”。

显示偏好设置窗口

Mac App 通常会显示一个偏好设置窗口,供用户管理特定于 App 的设置。用户可以通过选择 App 菜单,然后选择菜单栏中的“偏好设置”菜单项来查看这个窗口。如果你的 App 具有设置套装,系统会自动为你的 App 提供一个偏好设置窗口。要进一步了解,请参阅“显示偏好设置窗口”。

为你的主视图控制器应用半透明背景

采用分屏浏览控制器的 iPad App 在 macOS 中运行时,可以获得 Mac 风格的垂直分屏浏览视图。但是,要想让你的 iPad App 更像 Mac 的原生 App,你需要应用半透明效果来虚化桌面,使桌面融入主视图控制器的背景中。为此,请将分屏浏览控制器的 primaryBackgroundStyle 设置为 UISplitViewController.BackgroundStyle.sidebar,如摘录 1 中所示。

摘录 1 为主视图控制器添加半透明背景

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {


    let splitViewController = window!.rootViewController as! UISplitViewController
    let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController
    navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem
    
    // Add a translucent background to the primary view controller.
    splitViewController.primaryBackgroundStyle = .sidebar
    
    splitViewController.delegate = self
    
    return true
}

在视图中检测指针

无论是选择文本栏还是移动窗口,Mac 用户都要依赖指针与 App 进行交互。在用户将指针移动到 UI 元素上时,一些元素的外观会发生改变。例如,在指针移动到链接上时,网页浏览器会高亮显示链接。

要检测用户何时将指针移到你 App 中的某个视图上,请将 UIHoverGestureRecognizer 添加到该视图中。这样一来,你的 App 便能知道指针何时进入或离开该视图,或何时在该视图上移动。

摘录 2 在指针移到按钮上时,将按钮的默认颜色更改为红色

class ViewController: UIViewController {


    @IBOutlet var button: UIButton!


    override func viewDidLoad() {
        super.viewDidLoad()


        let hover = UIHoverGestureRecognizer(target: self, action: #selector(hovering(_:)))
        button.addGestureRecognizer(hover)
    }


    @objc
    func hovering(_ recognizer: UIHoverGestureRecognizer) {
        switch recognizer.state {
        case .began, .changed:
            button.titleLabel?.textColor = #colorLiteral(red: 1, green: 0, blue: 0, alpha: 1)
        case .ended:
            button.titleLabel?.textColor = UIColor.link
        default:
            break
        }
    }
}

另请参阅

App 支持