WWDC Quick Look 💓 By SwiftGGTeam
What's new in AppKit

What's new in AppKit

元の動画を見る

ハイライト

macOS Ventura は、Stage Manager ウィンドウのコラボレーション ルール、設定スタイル フォーム、およびNSComboButtonNSColorWell新しいスタイル、ツールバーのカスタマイズ API、SF Symbols 4 の可変シンボル、および新しい共有およびコラボレーション ポータル。


主要内容

macOS Ventura は、Mac アプリケーションの日常的な詳細の多くを変更します。

ウィンドウ、設定ページ、ボタン、色の選択、ツールバー、テーブル、シンボル、共有などの詳細が散在しているように見えます。これらすべての根底にあるのは同じ問題です。Mac アプリはシステムレベルのワークフローにさらに適応する必要があります。

Stage Manager は非アクティブなウィンドウを折りたたんで、現在のウィンドウを中央に残します。ドキュメント ウィンドウは、この動作に適しています。パネル、ポップアップ、設定、およびフローティング ツールが現在のウィンドウからはみ出さないようにしてください。AppKit はウィンドウのタイプに基づいて応答するようになりました。collectionBehaviorステージマネージャーがウィンドウの役割を決定できるように支援します。

設定も変更されています。システム アプリケーションの名前が「システム環境設定」から「システム設定」に変更され、コントロールを中心とした設定インターフェイスには新しいフォームの視覚スタイルが採用されています。AppKit はアプリケーション メニューの [設定] を [設定] に自動的に更新しますが、ウィンドウのタイトル、説明テキスト、ローカライズされた文字列は開発者自身が確認する必要があります。

コントロールレベル、NSComboButtonメイン アクションとドロップダウン メニューを同じコントロールに配置します。NSColorWell新しい外観、ミニマルで拡張されたスタイルを手に入れましょう。NSToolbarより細かいカスタム制約を追加しました。NSTableView行の高さが可変のテーブルには遅延計算を使用するため、大きなテーブルの初回読み込みが速くなります。

最後に、SF Symbols 4 では 450 を超えるシンボルと可変シンボルが追加されます。共有パネルもよりリッチなポップオーバーにアップグレードされ、プレビュー メタデータ、標準メニュー項目、コラボレーションへの招待エントリが提供されます。

詳細

Stage Manager では、ウィンドウがその役割を宣言する必要があります

(01:00) Stage Manager は、アクティブなウィンドウが中央に配置されるように、非アクティブなウィンドウをワークスペースの外に移動します。このスピーチでは、2 つのタイプのウィンドウが明確に区別されました。文書タイプの主ウィンドウは、この交換モデルに入る必要があります。パネル、ポップオーバー、設定、モーダル ウィンドウなどの補助ウィンドウは、現在のウィンドウの上に残しておく必要があります。

AppKitにはすでにNSWindowAPI ではこれらの動作について説明します。舞台監督は窓口を尊重しますcollectionBehavior。含まれている場合.auxiliary.moveToActiveSpace.stationaryまたは.transient、ウィンドウが中央のアクティブなウィンドウをはみ出すことはありません。

// 概念代码:transcript 明确列出这些 collectionBehavior 选项。
let panel: NSWindow = makeInspectorPanel()

panel.collectionBehavior.insert(.auxiliary)
panel.collectionBehavior.insert(.moveToActiveSpace)

キーポイント:

  • panelインスペクターやツールパネルなどの補助ウィンドウを表します。
  • .auxiliaryこのウィンドウが現在のワークフローを提供し、メインのドキュメント ウィンドウとは異なる役割を持つことをシステムに伝えます。
  • .moveToActiveSpaceワークスペースを切り替えた後にユーザーがコンテキストを失わないように、ウィンドウが現在のスペースに従うようにします。
  • ステージマネージャー、スペース、全画面はすべて同じグループを読み取りますcollectionBehavior情報。

この部分の実践は簡単です。すべてのウィンドウをドキュメント ウィンドウとして扱わないでください。設定、パネル、一時ツール、およびポップアップは、適切なウィンドウ タイプまたはコレクション動作を使用してその意図を表現する必要があります。

設定スタイル フォームは SwiftUI の段階的な導入に適しています

(02:42)Ventura では、システム環境設定の名前がシステム設定に変更されました。AppKit は、新しい SDK でビルドした後、アプリケーション メニューの「環境設定」を自動的に「設定」に変更します。この講演では、ウィンドウ タイトル、説明ラベル、その他のコントロール内のローカライズされたテキストは自分で検索して更新する必要があることも思い出させました。

(04:23) 新しい設定インターフェイスでは、コントロール中心のフォーム スタイルが使用されています。SwiftUIFormこのビジュアル言語は直接採用でき、独立した設定ウィンドウから開始して SwiftUI を段階的に導入するのに適しています。

enum AirDropVisbility: String, CaseIterable, Identifiable {
    case nobody = "No One"
    case contactsOnly = "Contacts Only"
    case everyone = "Everyone"

    var id: String { rawValue }
    var label: String { rawValue }
    var symbolName: String {
        switch self {
        case .nobody: return "person.crop.circle.badge.xmark"
        case .contactsOnly: return "person.2.circle"
        case .everyone: return "person.crop.circle.badge.checkmark"
        }
    }
}

struct ExampleFormView: View {
    @State private var name: String = "Mac Studio"
    @State private var screenSharingEnabled: Bool = true
    @State private var fileSharingEnabled: Bool = false
    @State private var airdropVisibility = AirDropVisbility.contactsOnly

    var body: some View {
        Form {
            TextField("Computer Name", text: $name)
            Toggle("Screen Sharing", isOn: $screenSharingEnabled)
            Toggle("File Sharing", isOn: $fileSharingEnabled)
            Picker("AirDrop", selection: $airdropVisibility) {
                ForEach(AirDropVisbility.allCases) {
                    Label($0.label, systemImage: $0.symbolName)
                        .labelStyle(.titleAndIcon)
                        .tag($0)
                }
            }
        }
        .formStyle(.grouped)
    }
}

キーポイント:

  • AirDropVisbility列挙を使用して設定のオプションを定義し、ラベルと SF シンボル名を指定します。
  • @Stateフォームの状態を保存します。設定ウィンドウの編集可能なオプションに適しています。
  • Form入れますTextFieldToggleそしてPicker, インターフェイス構造と設定項目を一致させます。
  • Label(..., systemImage:)システム シンボルをピッカー オプションに追加します。
  • .labelStyle(.titleAndIcon)テキストとアイコンを同時に表示します。
  • .formStyle(.grouped)トークからグループ化されたフォーム スタイルを適用し、ビジュアル、スクロール、レイアウトを SwiftUI で処理できるようにします。

アプリケーションにすでに AppKit 設定ウィンドウがある場合は、まず一連の独立した設定を SwiftUI に作成できます。Formをクリックして、既存のウィンドウを埋め込みます。この講演では、設定ウィンドウは通常、アプリのインターフェイスの別個の領域であるため、SwiftUI への優れたエントリ ポイントであるとされています。

新しいコントロールにより、独自に作成した組み合わせコントロールの数が削減されます

(05:37) AppKit が Ventura に追加されましたNSComboButton。これは、メインのワンクリック操作と追加オプションのメニューを同じコントロールに結合します。メールの「予測されたフォルダーへの移動」は典型的なシナリオです。デフォルトの場所には 1 回のクリックでアクセスでき、他のフォルダーは引き続きメニューから選択できます。

NSComboButton2つのスタイルがあります。分割スタイルには、メニューを開くための専用の個別の矢印領域があります。統一されたスタイルは通常のボタンのように見えます。クリックしてメインアクションを実行し、長押ししてメニューを表示します。

// 概念代码:transcript 只说明控件角色与两种样式。
let archiveButton = NSComboButton()

archiveButton.menu = archiveMenu
archiveButton.style = .split
archiveButton.target = self
archiveButton.action = #selector(archiveToSuggestedMailbox(_:))

キーポイント:

  • NSComboButton「デフォルトのアクション + その他のオプション」を 1 つのコントロールで表現します。
  • menu他のメールボックスやフォルダーへの移動など、追加の宛先をホストします。
  • .split講義のデフォルトのスタイルに対応して、矢印領域はメニューのみを担当します。
  • targetそしてaction通常のボタンのワンクリックのメインアクションを維持します。

07:21NSColorWellデフォルトの外観は自動的に更新されるため、コードの移行は必要ありません。また、最小限のスタイルと拡張されたスタイルも追加されます。最小限のスタイルでは、ロールオーバー時に開示矢印が表示され、クイック パレットがポップアップします。拡張されたスタイルは、素早い選択と完全な機能を兼ね備えています。NSColorPanel同じコントロールに入れてください。

// 概念代码:transcript 明确列出 colorWellStyle 的三个 case。
let colorWell = NSColorWell()

colorWell.colorWellStyle = .minimal

キーポイント:

  • NSColorWellデフォルトの外観は自動的に最新化されます。
  • .minimalツールバーまたはインスペクターでの小さな色の入力に最適です。
  • .expandedすっきりとした玄関、iWork スタイル: 左側にクイック選択、右側にフルパネル。
  • プルダウン ターゲット/アクションはドロップダウン領域を引き継ぎ、システム パレットをカスタム ポップオーバーまたはメニューに置き換えることができます。

ツールバーのカスタマイズでルールを作成できる

09:40NSToolbar新しい API は、2 つの一般的な問題を解決します。ユーザーが一部のアイテムを移動できないことです。また、一部の項目はツールバーの特定の領域にのみ表示されます。

この講演では 2 つのデリゲート メソッドがリストされています。toolbarImmovableItemIdentifiers移動または削除できない項目識別子を返します。toolbar(_:itemIdentifier:canBeInsertedAt:)並べ替え、挿入、削除を判断できます。

// 概念代码:方法名来自 transcript,用于展示规则位置。
func toolbarImmovableItemIdentifiers(_ toolbar: NSToolbar) -> Set<NSToolbarItem.Identifier> {
    [filterItemIdentifier]
}

func toolbar(
    _ toolbar: NSToolbar,
    itemIdentifier: NSToolbarItem.Identifier,
    canBeInsertedAt index: Int
) -> Bool {
    allowedSection.contains(index)
}

キーポイント:

  • toolbarImmovableItemIdentifiersメールフィルターボタンなど、固定位置に配置する必要があるアイテムに適しています。
  • 返された識別子は、カスタム モードでは移動または削除されません。
  • canBeInsertedAt位置に基づいて挿入が正当であるかどうかをアプリケーションに判断させます。
  • allowedSection.contains(index)「特定の段落にしか配置できない」というルールを表現します。

10:56centeredItemIdentifiers複数の中央揃えの項目をサポートします。ツールバーがカスタマイズ可能な場合、これらの項目は追加または削除できますが、再配置できるのは中央のグループ内のみです。NSToolbarItem.possibleLabels可変タイトルに使用されます。ツールバーの幅は、状態を切り替えるときに他の項目が左右にジャンプしないように、最長のタイトルに基づいて計算されます。

// 概念代码:属性名来自 transcript。
toolbar.centeredItemIdentifiers = [cropIdentifier, adjustIdentifier, filterIdentifier]

muteItem.possibleLabels = ["Mute", "Unmute"]

キーポイント:

  • centeredItemIdentifiersツールのグループをツールバーの中央領域に固定します。
  • 中央に配置されたグループは、ユーザー設定に従って再配置できます。
  • possibleLabels同じアイテムに対してどのローカライズされたタイトルが表示されるかをツールバーに事前に通知します。
  • ツールバーは最長のタイトルに応じて幅を確保し、状態を切り替えてもレイアウトは安定します。

可変行高テーブルは、すべての行を急いで測定する必要がなくなりました。

13:43NSTableView以前は、スクロール操作のためにすべての行の高さが事前に計算されていました。行の高さが可変のテーブルに大量のデータがある場合、これらの計算により最初のロードが遅くなります。

ベンチュラは怠惰な計算に変更されました。NSTableView現在のビューポートの近くの行のみを測定します。未測定の行は、測定された行から導出された現在の推定高さを使用します。スクロールするとき、テーブルは実際の行の高さを再要求し、正しいスクロール位置を維持します。

// 概念代码:delegate 回调仍然存在,但调用时机在 Ventura 中改变。
func tableView(_ tableView: NSTableView, heightOfRow row: Int) -> CGFloat {
    heightCache[row] ?? estimatedHeight(for: row)
}

キーポイント:

  • heightOfRowここで行の高さが指定されます。
  • Ventura は必要に応じて行の高さを要求しますが、起動時にすべての行が一度に要求されることは保証されなくなりました。
  • コードはデリゲート呼び出しの特定のタイミングに依存すべきではありません。
  • 最適化が自動的に適用されますNSTableViewとSwiftUIList、オプトインを適用する必要はありません。

SF Symbols 4 は、優先レンダリング モードと可変シンボルを追加します

(15:32) SF Symbols 4 では、Ventura に 450 以上の新しいシンボルが追加されます。シンボルのレンダリング モードには、引き続きモノクロ、階層、パレット、およびマルチカラーが含まれます。新しい優先レンダリング モードにより、シンボルは独自の優先デフォルト レンダリング モードを宣言できます。AppKit は実行時にこの設定を自動的に使用します。

(17:28) 変数シンボルは、数量を 0 から 1 までの浮動小数点値として表します。シンボル内にはしきい値があり、パスは受信値に基づいて変更されます。講演では、Wi-Fi 信号の強度と音量の例を挙げました。

// 概念代码:transcript 说明新增 initializer 比现有 symbol initializer 多 value 参数。
let signalLevel = 0.75
let image = NSImage(
    systemSymbolName: "wifi",
    variableValue: signalLevel,
    accessibilityDescription: "Wi-Fi signal"
)

キーポイント:

  • systemSymbolNameSFシンボルを選択します。
  • variableValue0 から 1 までの浮動小数点数です。
  • シンボル 変数のしきい値が定義されていない場合、この値は無視されます。
  • シンボル しきい値が定義されている場合、パスは数値的に変化します。
  • 可変シンボルは、パレット、マルチカラー、その他のレンダリング方法で使用できます。

共有ポータルがポップオーバーにアップグレードされ、コラボレーションへの招待がサポートされます。

(18:50) Ventura の共有エクスペリエンスは、古い共有メニューからより有益な共有ポップオーバーにアップグレードされました。オリジナルを保持したまま、文書情報と推奨人物を表示できますNSSharingServicePickerAPI およびデリゲート メソッド。

ファイルの URL を共有している場合は、NSSharingServicePickerアイコン、名前、ファイルのメタデータを自動的に入力できます。カスタム タイプを共有する場合、アイテムを追従させることができますNSPreviewRepresentableActivityItem、基礎となる共有オブジェクト、タイトル、画像プロバイダー、およびアイコンプロバイダーを提供します。AppKit は次のサービスも提供しますNSPreviewRepresentingActivityItem便利なカテゴリーとして。

// 概念代码:API 名称来自 transcript,用于展示自定义分享 item 的组成。
let previewItem = NSPreviewRepresentingActivityItem(
    item: itemProvider,
    title: documentTitle,
    image: previewImage,
    icon: documentIcon
)

let picker = NSSharingServicePicker(items: [previewItem])

キーポイント:

  • NSPreviewRepresentingActivityItem共有対象ユーザーとプレビュー メタデータを一緒に保ちます。
  • itemProviderそれは本当に共有する必要があるものです。
  • titleimageiconポップオーバーを共有するためのヘッダー表示。
  • 画像生成コストが高い場合、スピーチなどにおすすめNSItemProvider配達が遅れました。

(20:44) 共有エントリがメニューから来た場合、NSSharingServicePicker作成できるstandardShareMenuItem。メイン メニューまたはコンテキスト メニューに追加した後、ユーザーがメニュー項目を選択すると、標準の共有ポップオーバーが開きます。コンテキスト メニューのシナリオでは、ポップオーバーはメニューを生成したビューに固定されます。

// 概念代码:属性名来自 transcript。
let shareItem = picker.standardShareMenuItem
contextMenu.addItem(shareItem)

キーポイント:

  • standardShareMenuItem共有サービスを手動で列挙することは避けてください。
  • メニューエントリは引き続きシステム標準の共有ポップオーバーに入ります。
  • アプリケーションはピッカーのフィルタリング機能とカスタム サービス機能を引き続き使用できます。
  • 共同アプリケーションは、CloudKit、iCloud Drive、または独自のサーバー アクセスの招待プロセスを引き続き探索できます。

重要ポイント

1. ステージマネージャー適応リストを作成する

  • 作業内容: アプリケーション内のドキュメント ウィンドウ、設定ウィンドウ、インスペクター、フローティング パネル、ポップアップ ウィンドウを移動し、ウィンドウの種類ごとに役割を指定します。
  • 実行する価値がある理由: ステージ マネージャーは、collectionBehavior既存のウィンドウを中央領域の外に移動するかどうかを決定します。
  • 開始方法: セカンダリ ウィンドウを使用するかどうかを確認します.auxiliary.moveToActiveSpace.stationaryまたは.transient

2. 設定ページを SwiftUI に移行するForm

  • 何をすべきか: SwiftUI を使用して、一連の独立した設定を選択しますForm書き直して適用する.formStyle(.grouped)
  • 価値がある理由: 設定ウィンドウには通常、明確な境界線があり、AppKit アプリケーションでの SwiftUI の段階的な導入に適しています。
  • 開始方法: のみで開始しますTextFieldTogglePickerページ、元の AppKit ウィンドウ コンテナーを保持します。

3. 使用するNSComboButton2 つのボタンまたはセグメント化されたコントロールを置き換える

  • 何をすべきか: 「デフォルトのアクション + その他の目標」コントロールを 1 つに結合します。NSComboButton
  • 実行する価値がある理由: スピーチでは、以前はこの種のインタラクションを説明するためにセグメント化されたコントロールが使用されていましたが、現在は専用のコントロールがあると明確に述べられています。
  • 開始方法: ツールバーで隣接するメイン ボタンとドロップダウン ボタンを見つけ、メイン アクションをボタン アクションに配置し、追加の選択をメニューに配置します。

4. カスタム ルールをツールバーに追加する

  • 内容: 主要なツールバー項目を移動、削除、挿入できる場所を制限します。
  • 実行する価値がある理由: Ventura のNSToolbarデリゲートには不動アイテムと挿入位置判定が追加されました。
  • 開始方法: 実装toolbarImmovableItemIdentifiers、次に使用しますcanBeInsertedAtアイテムが特定のエリアにのみ表示されるように制限します。

5. 共有オブジェクトの完全なプレビュー メタデータ

  • 内容: カスタム共有コンテンツの共有ポップオーバーにタイトル、プレビュー、アイコンを表示できるようにします。
  • 実行する価値がある理由: Ventura の共有ポップオーバーには、より多くのドキュメント情報が表示され、提案された人物やコラボレーション ポータルがサポートされます。
  • 開始方法: カスタム共有オブジェクトで使用しますNSPreviewRepresentableActivityItemまたはNSPreviewRepresentingActivityItem、メニューエントリが使用されますstandardShareMenuItem

関連セッション

コメント

GitHub Issues · utterances