WWDC Quick Look 💓 By SwiftGGTeam
What's new in Mac Catalyst

What's new in Mac Catalyst

元の動画を見る

ハイライト

macOS Monterey は、Mac Catalyst に 4 種類のネイティブ Mac エクスペリエンスをもたらします。それは、4 つのボタン モード (プッシュ/トグル/プルダウン/ポップアップ)、ツールヒントのホバー プロンプト、印刷メニューの統合、およびウィンドウ サブタイトルであり、iPad アプリケーションを Mac 上のネイティブ アプリケーションに近づけます。

主な内容

ボタンシステムのMac化

Mac ユーザーは、特定のボタン操作方法に慣れています。プッシュ ボタンを押すと実行され、トグル ボタンは状態を切り替え、プルダウン メニューはメニューを展開し、ポップアップ ボタンは選択後にタイトルを変更します。iPad アプリケーションは直接 Mac に移動されるため、ボタンの動作が「間違っている」ことがよくあります。

macOS Monterey は、次の 2 つのプロパティを通じてこの問題を解決します。showsMenuAsPrimaryActionそしてchangesSelectionAsPrimaryAction。4 つのブール値の組み合わせは 4 つのボタン タイプに対応し、必要なコードは数行だけです。

ホバープロンプトが情報のギャップを埋める

Mac ユーザーはインターフェイス要素を見ると、本能的にマウスをホバーしてプロンプトを待ちます。iPad アプリにはこの機能がないため、コントロールの多くは推測する必要があります。

UIToolTipInteraction任意の UIView でホバー ヒントを表示できるようにします。UILabelもサポートしていますshowsExpansionTextWhenTruncated、切り詰められたときにホバーすると全文が表示されます。

印刷およびウィンドウの字幕

印刷は Mac アプリの基本機能です。新しいUIApplicationSupportsPrintCommandplist キーは自動的に [ファイル] > [印刷] メニューを追加します。printContentレスポンダー メソッドは印刷ロジックを処理します。

ウィンドウサブタイトルscene.subtitleウィンドウのタイトル バーにコンテキスト情報を追加します。これは、ナビゲーション バーのタイトルよりも Mac の習慣に沿ったものです。

##詳細

4 つのボタン構成 (02:26)

// Push Button — 標準の押下ボタン
let pushButton = UIButton(type: .system)

// Toggle Button — クリックで選択状態を切り替える
let toggleButton = UIButton(type: .system)
toggleButton.changesSelectionAsPrimaryAction = true

// Pull-down Menu — クリックでメニューを展開する
let pullDownButton = UIButton(type: .system)
pullDownButton.menu = UIMenu()
pullDownButton.showsMenuAsPrimaryAction = true

// Pop-up Button — 選択後にボタンタイトルが追従して変わる
let popupButton = UIButton(type: .system)
popupButton.menu = UIMenu()
popupButton.showsMenuAsPrimaryAction = true
popupButton.changesSelectionAsPrimaryAction = true

キーポイント:

  • showsMenuAsPrimaryAction = true: 左クリックしてメニューを直接展開します (Mac の習慣)。長押しや右クリックに依存しなくなりました。
  • changesSelectionAsPrimaryAction = true: ボタンのタイトルは、メニューで選択した項目を自動的に追跡します。
  • 4 つの組み合わせで Mac のすべての標準ボタン タイプをカバー
  • Mac イディオムを使用している場合、メニュー設定のないボタンを長押しすることでトリガーできます。 iPad の場合、右クリックしてメニューを起動できます。

ツールヒントをコントロールに追加します (03:50)

// 方法 1: 任意の UIView に ToolTip を追加する
let toolTipInteraction = UIToolTipInteraction(defaultToolTip: "Iguaçu Falls in Brazil")
imageView.addInteraction(toolTipInteraction)

// 方法 2: UIControl に ToolTip をすばやく設定する
let switchControl = UISwitch()
switchControl.toolTip = "Enable automatic updates"

// 方法 3: 省略されたラベルにホバーして全文を表示する
let label = UILabel()
label.text = "Very long title that will be truncated"
label.showsExpansionTextWhenTruncated = true

キーポイント:

  • UIToolTipInteraction任意の UIView に適用可能、インタラクション オブジェクトを作成する必要がある
  • UIコントロールtoolTipプロパティはたった 1 行のコードのショートカットです
  • showsExpansionTextWhenTruncatedテキストが切り詰められた場合にのみツールヒントを表示し、インターフェイスをきれいに保ちます

ウィンドウのサブタイトル (06:01)

// scene の接続時にサブタイトルを設定する
func scene(_ scene: UIScene, willConnectTo session: UISceneSession,
           options connectionOptions: UIScene.ConnectionOptions) {
    scene.subtitle = "Countries"
}

// またはナビゲーションに応じて動的に更新する
func updateSubtitle(for selection: String) {
    guard let scene = view.window?.windowScene else { return }
    scene.subtitle = selection
}

キーポイント:

  • サブタイトルはウィンドウのタイトル バーに表示されます。これは、ナビゲーション バーのタイトルよりも Mac の設計仕様に準拠しています。
  • 違うtoolbarStyle下部字幕の表示位置が異なるため実験的に調整が必要です。
  • 現在選択されている項目またはアプリケーションのステータスコンテキストの表示に適しています

印刷サポート (04:52)

まず Info.plist に追加します。

<key>UIApplicationSupportsPrintCommand</key>
<true/>

印刷はレスポンダー チェーンを介して処理されます。

// DetailViewController.swift
override func printContent(_ sender: Any?) {
    let printInteractionController = UIPrintInteractionController.shared
    // 印刷内容を設定する
    printInteractionController.present(animated: true)
}

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if action == #selector(self.printContent(_:)) {
        // 現在選択中の内容がある場合だけ印刷を許可する
        return selectedItem != nil
    }
    return super.canPerformAction(action, withSender: sender)
}

// Root SplitViewController で一元的にディスパッチする
override func target(forAction action: Selector, withSender sender: Any?) -> Any? {
    switch action {
    case #selector(UIResponder.printContent(_:)):
        // 業務ロジックに応じて、どの子コントローラーが印刷を処理するかを決める
        return currentPrintTarget
    default:
        return super.target(forAction: action, withSender: sender)
    }
}

キーポイント:

  • UIApplicationSupportsPrintCommand[ファイル] > [印刷] および [PDF としてエクスポート] メニュー項目を自動的に追加します
  • printContentUIResponder の新しいアクションであり、レスポンダー チェーン ルックアップを通じて実装されます。
  • canPerformAction現在の状態で印刷を許可するかどうかを制御します
  • target(forAction:withSender:)ルートコントローラーでの統合スケジューリングにより強制を回避becomeFirstResponder

iPad のボタン スタイルを維持する (07:34)

Mac イディオムはデフォルトでネイティブの Mac コントロールを使用しますが、場合によっては iPad スタイルのボタン (広い領域の塗りつぶしボタンなど) を維持する必要がある場合があります。

let button = UIButton(configuration: .filled(), primaryAction: nil)
button.configuration?.image = UIImage(systemName: "leaf")
button.preferredBehavioralStyle = .pad
button.configuration?.preferredSymbolConfigurationForImage =
    UIImage.SymbolConfiguration(pointSize: 60)
button.changesSelectionAsPrimaryAction = true
button.configurationUpdateHandler = colorUpdateHandler

キーポイント:

  • preferredBehavioralStyle = .padiPad のレイアウト動作を強制して、ボタンの背景がいっぱいに伸びるようにします
  • 特定のコントロールでのみ使用され、グローバルな使用は推奨されません
  • Mac の 77% 拡大縮小ルールとは異なり、iPad スタイルは元のサイズを維持します。

重要ポイント

  1. やるべきこと: 既存の iPad メモ作成アプリに Mac Catalyst サポートを追加し、ツールチップを使用してツールバー ボタンの機能をデモンストレーションします。
  • 価値がある理由: Mac ユーザーはインターフェイスを理解するためにホバー ヒントに依存しており、ツールヒントを追加すると、アプリが即座にネイティブ Mac アプリに似たものになります。
  • 開始方法: 各ツールバー ボタンの設定toolTipプロパティ、切り詰められたドキュメント タイトルに対して有効showsExpansionTextWhenTruncated
  1. やるべきこと: Mac 版のファイル管理アプリケーションに印刷機能を追加し、現在選択されているファイル リストの印刷をサポートします。
  • 価値がある理由: Mac ユーザーにとって印刷は基本的な機能です。UIApplicationSupportsPrintCommandplist 設定の 1 行で標準メニューを追加できます
  • 開始方法: plist キーを追加し、ファイル リスト コントローラーに実装します。printContentそしてcanPerformAction
  1. 対処法: 元のセグメント コントロールの代わりに、Mac バージョンの設定アプリのポップアップ ボタンを使用します。
  • 実行する価値がある理由: ポップアップ ボタンは Mac の標準コントロールであり、セグメント コントロールよりも省スペースで使いやすいです。
  • 開始方法: を使用しますUIButton + changesSelectionAsPrimaryAction = true + showsMenuAsPrimaryAction = trueポップアップボタンの作成
  1. やるべきこと: Mac ブラウザ/ファイル マネージャーのウィンドウ サブタイトルを使用して現在のパスを表示します。
  • 実行する価値がある理由: サブタイトルは、ナビゲーション バーのタイトルよりも Mac の設計仕様に準拠しており、コンテンツ領域のスペースを占有しません。
  • 開始方法:UISceneDelegate中程度の設定scene.subtitle、ナビゲーションが変更されると更新されます

関連セッション

コメント

GitHub Issues · utterances