后浪云IOS教程:针对 Mac 优化你的 iPad App
概览
你完全不用费任何力气,即可让你 iPad App 的 Mac 版本支持 macOS 中的许多系统功能,其中包括:
- App 的默认菜单栏 
- 支持触控板、鼠标和键盘输入 
- 支持调整窗口大小和全屏显示 
- Mac 风格的滚动条 
- 拷贝和粘贴支持 
- 拖放支持 
- 支持系统触控栏控件 
此外,你还可以扩展你的 App 来利用更多系统功能。
重要信息
 用 Mac Catalyst 构建的 Mac App 只能使用 Mac Catalyst 中标记为可用的 AppKit API,例如 NSToolbar 和 NSTouchBar。Mac Catalyst 不支持访问不可用的 AppKit API。
添加菜单栏项目
 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  }  } }

