ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
Mac Catalystの新機能
Mac Catalystの最新のアップデートを確認し、AppをmacOS上でより快適にお使いいただくための方法を確認しましょう。さまざまな新しいUIKit APIや強化されたUIKit APIについて説明します。これらのAPIを使用してMac Catalyst Appをカスタマイズすることで、macOS固有の動作を活用できるようになります。 このセッションを最大限活かしていただくためには、Mac Catalystの基礎を理解していることが推奨されます。WWDC19の「iPad Apps for Macの紹介」にて詳細を確認してください。Mac Catalyst Appの改良について詳しくは、WWDC20の「Mac Catalyst Appのインターフェイスの最適化」をご確認ください。
リソース
- Bring an iPad App to the Mac with Mac Catalyst
- Building and improving your app with Mac Catalyst
- Human Interface Guidelines: Mac Catalyst
- Mac Catalyst
関連ビデオ
WWDC21
- 優れたMac Catalyst Appの条件
- M1搭載Macにおける優れたiPad/iPhone Appの条件
- macOSのショートカットについて
- UIKitの新機能
- UIKitボタンシステムについて
WWDC20
WWDC19
-
ダウンロード
ようこそ Mac Catalystの最新情報へ ジェイソン・ビーバーです ニック・タイスラーも 後ほど登場します Mac Catalystは既存の iOSアプリをmacOSに対応させ 大きなディスプレイーー 統合されたキーボード マウスや トラックパッドをーー 最大限活用するための 技術です たくさんの開発者が Mac Catalystを使ってーー iOSアプリを macOSに移動しています 成果は驚くべきものでした 最近Apple Awardを 受賞したーー Mac Catalystのアプリを ご紹介します
Shapr3Dは MacとiPadの 両方に対応した-- 産業用CADツールです iPad版はマルチタッチとApple Pencilの使用が前提でした Mac Catalystで構築された 新しいMac版では デスクトップユーザーの 期待に応えてーー マウスとキーボードが 使用できます
Instapaperはオフラインで 記事を読む人気のアプリです Macに登場したのは Mac Catalystのおかげです Notabilityは 優れたメモ帳アプリです Mac版から置き換えられた 新しいバージョンのアプリは iPadのクールな機能を 残してます Macのスクリーンサイズ キーボードもーー 高速性を活かして 最適化されています Apple Pencilを使った Sidecarにも対応しています まず 新しいAPIの概要を 説明してからーー macOS Montereyで 強化したAPIを説明します 最後に ニックがこれらの 新しいAPIをーー デモアプリに採用した時の アクションを紹介します それでは macOS Montereyのーー 新しいAPIの概要から 始めます
以前 macOS Big Surでは showsMenuAsPrimaryAction プロパティを使いーー ボタンにメニューを 割り当てる機能を追加した これでプルダウンメニューを 作成できるようになった
今回 macOS Montereyでは 新しいプロパティのポップ アップボタンを追加した changesSelectionAsPrimary Actionです ボタンのタイトルがメニューの 選択を追跡するのです この2つのプロパティが 加わりーー ボタンの設定方法は 4通りになった
両方のプロパティを falseに設定するとーー 標準的なプッシュボタンが 表示される ボタンを長押しした時に メニューが設定されていると メニューを 表示することができます そのボタンを作るための コードは以下のとおりです
changesSelectionAs PrimaryActionのみが trueに設定されている場合は クリックすることでーー オンオフを切り替えられる トグルボタンが表示される これはアプリの状態を 示すために使用できる
showsMenuAsPrimaryActionが 唯一trueに設定されるとーー プルダウンメニューが 表示される 両方のプロパティが trueに設定された場合は 新しいポップアップボタンが 表示されます 次のボタンは プライマリアクションです メニューを表示するように 設定されています このボタンはプライマリ インタラクションです macOSの左クリックし すぐにメニュー表示します しかしプライマリアクション メニューを表示するようーー 設定されていない ボタンの場合 その動作はアプリの イディオムに左右される iPadのイディオムでメニューは セカンダリインタラクション これはmacOSでは 右クリックです しかしアプリがMacの イディオムを採用してると ボタンの長押しでメニューが トリガーされます
ビデオ「Meet the UIKit button system」でーー ボタンの新機能については 詳しく紹介しています 今 Mac Catalystのアプリで ツールチップが使えます ツールチップとはアプリの 画面にカーソルを置くとーー 表示される小さな フローティングウィンドウです そしてコンテンツや 追加の詳細をーー 提供するために 使用することができます 任意のUIViewに ツールチップを追加するには UIToolTipInteractionを テキスト文字列で作成しーー 使用します そのインタラクションを ビューに追加することだけです
しかし ツールチップの 一般的な使用法の1つは UI内のコントロールの動作を 明確にすることです これはよくある パターンなので UIControlに便利な プロパティを追加しーー ツールチップを素早く 設定できるようにしました
iOSアプリでは 編集不可の文字列をーー 表示するためにラベルが 使用されています ラベルが長すぎて 収まらない場合は そのラベルはテキストを 削除しなければなりません 今回 macOS Montereyでは 拡張ツールチップに 対応したためーー ラベルの全容を 見れるようになりました このサンプルUIでは タイトルラベルの内容が 長すぎて収まりません 拡張ツールチップを 有効にすることでーー ラベルにマウスを重ねます すると フルタイトルが 表示されるようになりました showsExpansionTextWhen Truncatedというーー UILabelの新しいプロパティで これを有効にできます
UIApplicationSupportsPrint Commandというーー 新しいinfo.plistキーを 導入しました これはinfo.plistに 追加できます trueに設定すると メニュー項目ーー “印刷”と“PDF エクスポート”をーー Mac Catalystの起動時に 自動的に追加します このplistキーは iOSアプリにも追加できます iPadOSのショートカット オーバーレイにーー “印刷”オプションが 表示されます iOSアプリをM1 Macで 実行した場合 “印刷”とーー “PDFエクスポート”の メニューが表示されます
このplistキーは“印刷”と “PDFとしてエクスポート”の メニュー項目を要することを OSに伝えるものですがーー まだ説明は半分です 印刷サポートをコードに 明示的にーー 実装する必要があります このためprintContentという 新しいUIResponderのーー アクションが 用意されています どのUIResponderにも 実装できます そして レスポンダチェーン 検索によってーー 適切なプリントターゲットを 見つけることができます printContentの実装が 呼び出された場合は UIPrintInteraction Controllerを通常通りーー 設定して使用するだけです ウインドウにサブタイトルも 入れられるようになりました これはアプリの状態に関する 補足的な情報をーー 提供するために有効でしょう これはUISceneの新しい プロパティで設定できーー サブタイトルと 呼ばれています
macOS Montereyでは ショートカットアプリが 利用できるようになりました iOSでカスタムインテントを 採用しているアプリでは SiriやMacの ショートカットもーー 利用できるようになります インテントのハンドリングと インテントの拡張のーー 両方がアプリ内で可能です このため Mac Catalystアプリでーー インテントの拡張の構築を 無効にしていた場合は 再度有効にできます 「Meet Shortcuts for macOS」のビデオでーー 詳細をご覧いただけます macOS Montereyで 新たに追加された当社のーー APIの概要説明は 以上になります 次の説明に移りましょう macOS Montereyで 強化されたAPIの概要です アプリのテーマに合わせて 記述したカスタムボタンや スライダーがある場合は Macイディオムを採用し Mac Catalystで 維持することができます ネイティブコントロールの 選択をした時です しかし 77%に縮小するには 自己処理の必要があります アプリ全体ではなく アプリの操作性をーー 左右する特定の コントロールに限って 行うことをお勧めします 新しいボタンシステムも クロスプラットフォームに対応 アプリのテーマに合った ボタンを作成できます ビデオ「Meet the UIKit button system」でーー これについて 詳しく紹介しています UIBehavioralStyleという 新しい列挙型で実現できます UIButtonとUISliderは角2つ 新しいプロパティがあります preferredBehavioralStyleは 読み書き可能で behavioralStyleは このプロパティ読み取りーー 専用の解決済みの値です iOSではbehavioralStyleの 解決済み値は変更されない よって この行のコードを .padか ,macに設定すれば iOSアプリに影響なくーー Mac Catalystに対処できます
ドキュメントベースアプリの 新しいplistプロパティは UIApplicationSupports TabbedSceneCollectionです ウィンドウのタブ化を 避けることができます false設定だとウィンドウの タブ機能が無効になりーー デフォルトのタブ関連の メニューが追加されない カーソルを非表示にして Macのウィンドウ外に 出ないようロックするーー UIPointerLockStateを 追加しました これはゲームに とても便利な機能です ユーザーが不用意に クリックしてーー 別のアプリを前面に 出てしまうことを防ぎます アプリやウィンドウの 切り替えで一時的にーー ロック解除し ウィンドウを クリックすると再ロックします
また UIPointerShapeを使い 水平軸または垂直軸でーー iBeamカーソルを取得できる macOSでこのAPIを 使用するとNSCursorのーー 標準的な形状の1つが 得られます
最後に 我々がサポートする ポインターのスタイルですが アプリ内で必要に応じて カーソルを隠せます UIKitのAPIの新しいものや 強化されたものは以上です それでは これらの新しく 強化されたーー APIを使って Mac Catalystアプリを Macで快適に 使う方法について これからニックが説明します ありがとう ジェイソン これらの新機能は 非常に面白いです 私も実際に試してみました 今回はCatalystチームが 開発したーー アプリのデモ紹介します Catalystチームはトラベル ライターとして活躍してます そこで iPhoneとiPad用の トリッププランナーを 開発しました これがトリッププランナー M1を搭載した13インチの MacBook Proで起動します
できるだけ多くのユーザーに アプリを提供するために-- M1 Macでアプリを 動作させることにしました このアプリの機能を 紹介します 世界中の素晴らしい場所を リストアップし 様々なフリークエント トラベラープログラムの 特典ポイントと 交換できるアプリです そのUIは 3列のスプリット ビューコントローラーを 中心に構成されています サイドバーを使って お気に入りの国のーー 宿泊施設やレストラン サイトをナビゲートしたり ポイントプログラムを 選ぶことができます サイドバーで選択する時 それがカテゴリーであれば スプリットビュー コントローラーの補足欄に トリッププランナーは その内容を表示します 補助的なビュー コントローラーには 日本 スペイン ブラジル タンザニアのーー 観光スポットやレストラン 宿泊施設などが表示されます サイドバーのリーフアイテム または補助的なビューーー コントローラーのアイテムは 詳細表示されます セカンダリービュー コントローラーに お気に入りの日本のカフェを 選択します 詳細ビュー コントローラーにーー カフェの概要が表示されます 旅行計画に役立つボタンや カフェがどこにあるかを 示す地図があります トリッププランナーに 関しては すべての機能がM1 Macで すぐに使えました しかし iOSアプリである以上 Macでも違和感なくーー 使用できるようにするには 限界がありました そこで このチェック ボックスにチェックを入れて Mac Catalystのアプリにする 必要がありました このチェックボックスが 特殊です ズームして そしてここにチェックを入れ アプリを強化します これがMac Catalyst用の トリッププランナーです 新しいウィンドウを 開くためのーー ダブルタップジェスチャー 認識機能や タイトルバーの表示の カスタマイズなど 徹底的にMacに 最適化することでーー ネイティブコントロールと シャープなテキストを実現 「優れたMac Catalyst アプリの条件 を見る」と 「Mac Catalystアプリの インターフェイスをーー 最適化する」のビデオを ご覧ください このプロセスの 詳しい説明があります トリッププランナーの 最新版では 先ほどジェイソンが話した 新しいAPIを採用しました それぞれの採用例を ご紹介します サンプルプロジェクトの ダウンロードをお勧めします ここで紹介するスニペットは すべて このコードから 直接引用しています macOS Monterey用にアプリを アップデートしました もう一度 抹茶カフェを 選びます 背景色のついたmacOS スタイルのボタンという形で UIに色がついているのが 分かります この話はあとでします Sceneサブタイトルの話を 先にします 新しいUISceneサブタイトル プロパティを使ってーー 2つのことをしています まず サブタイトルを使って 詳細表示のコントローラーの タイトルを Macで快適になるように 表示しています ウィンドウのサブタイトルは ナビゲーションアイテムの タイトルよりも Macらしいものです 2つ目はユーザーがアプリ 操作で役立つ文脈を 提供するべくサブタイトルを 変更することです トリッププランナーで日本と タンザニアを選択します
ウィンドウのサブタイトルには “各国”と書かれています ここの補助的なビュー コントローラーで 小さなキャンプ場を選択すると サブタイトルが変わりーー “Glamp Kilimanjaro”を 選択したのが分かります リワードプログラムの セクション全体を選択すると サブタイトルは再び「国と リワードプログラム」になる これでユーザーが 文脈を理解します あなたのCatalystアプリでも サブタイトルが どんな文脈になるか 考えてみてください また サブタイトルの表示は それぞれーー UITitlebar toolbarStyle ごとに異なっています アプリに最適な外観を 探してみてください
サブタイトル設定には まず文字列の値を入力し sceneへの参照を 取得してからーー サブタイトルプロパティを 設定します この設定はscene接続時に 行うか あとからーー ビューのウィンドウのシーンに アクセスして行えます 次にトリッププランナーでの ツールチップの採用について お話しします macOSで 非常によく見られるーー インタラクションパターンは 何かにマウスを一瞬重ねると その何かについての詳細を 知ることができます この手法は アプリのUIを汚さずに ユーザーを教育するための 昔からある方法です ツールチップは削除された ラベルの全文を表示できます
ここでは私が選んだ ブラジルのイグアスの滝 画像の上にしばらく マウスを置いておくと ツールチップが表示されます 曇りの日 轟音を立て流れる イグアスの滝を囲むように 深緑の豊かな森が 広がっている 何と素敵な説明でしょう 新しいUIToolTip Interaction APIを使用して この機能をすべての画像に 追加しました すると Macでも快適に 使えるようになりました
また UILabel APIの使用で 国際通貨フォーマットのため 削除され 少し長くなった これらのラベルを 拡張できるようにしました
先ほどジェイソンが 説明したように ツールチップAPIには 様々な形態があります バナーの場合では UITooltipInteraction Delegate を使わずに UITooltipInteraction APIを 使用することは 任意のビューに一定の テキストを ツールチップで添付したい 私のニーズに合っていました
通貨のテキストに UILabelの プロパティであるーー UILabelのhowsExpansionText WhenTruncatedを使った また 任意のコントロールに ツールチップを 付けたい場合は UIControlの ToolTipプロパティが 正しいAPIの使い方です
macOS Montereyに搭載した Catalystで利用できるーー 続いて 様々な新しい ボタンの紹介です 新しいiOS 15のーー UIButtonConfiguration API 紹介ビデオ 「UIKitボタンシステムの 紹介」を ぜひご覧ください これらの新しい UIButtonConfigurationーー プロパティの多くはMac用 Catalystアプリで 独自の表現をします さらに iOSのように 混在が可能です IButtonに定義された プロパティとーー UIButtonConfigurationに 定義されたプロパティを 今から たくさんのボタンを お見せし その後でーー 各ボタンのコード設定を 見てみましょう
新しいボタンの背景色を 見せるために 新しい目的地を選んでみます コパカバーナはいかが? ここのボタンは塗りつぶした 状態で使用しているため 周囲の色合いから 画像や背景のぼかしにーー マッチした色を 自動的に得ることができます リワードの詳細表示の コントローラーの話に移ろう リワードプログラムを サイドバーから表示します
Diamond Dubloons リワードプログラムを選択 旅行で獲得した ポイントを交換し 交換するものを 選べるようにするのが このビューの目的です
スライダーで 消費ポイント数を選べます このトグルボタンで ポイント倍率を有効にして 付属メニューで 倍率の選択も可能です 一番大きな数を ポイントの倍率にーー 選ぶことは意味があると 思います 6にしましょう キャッチコピーは何でしょう この大きなボタンを トグルしてーー 払い戻しカテゴリーを 選びます
ポイントを交換するか 現金化するかーー または寄付するかを選べます 最後に送信する際には 右下の送信ボタンを クリックします このリセットボタンで 最初からやり直しも可能です ここには新しいボタンが たくさんあります それぞれの設定方法を 紹介していきます
まずは 私たちが よく知っているーー プッシュボタンです detail-viewコントローラで これは送信ボタンでした これはBig Surで紹介した システムタイプのUIButtonを その役割をプライマリに 設定しただけのものです
次はポイント倍率の メニューボタンです このボタンはクリックで 状態が切り替わり 長押しでメニューが 表示されます 最終的には背景色を カスタマイズしたいので 塗りつぶしの設定を使い タイトルをーー “Points Multiplier”にする
トグル動作をさせるには ジェイソンが説明した新しい 真偽値プロパティにする changesSelectionAs PrimaryAction これをtrueに設定します これで ボタンの背景色は アプリの淡彩とーー 色合いの間で切り替わります
メニューも添付しておきます 倍率とUIActionsを 設定しました
最後に メニューの アクションハンドラーで ユーザーがポイント倍率の 最大数を選択した場合 条件付きでトグルの背景色を 赤に変更します
次は リセットボタンの 設定です
プレーンな設定でーー 枠なしの外観にできます この構成は iPadOSの外観とーー よく似ています
ボタンの役割を 破壊的に設定し 誤ってアクションを 起こしてしまわないようーー イベント処理を行うように システムに指示します そして その淡彩を赤に 設定します これでこのボタンはおしまい ビュー左下の ポップアップボタンは 交換 現金払い 寄付から 選択できーー ボタン設定APIを 使う必要ありません システムボタンを作成して changesSelectionAs PrimaryActionを trueに設定します これがポップアップボタンの 意味的な役割です
次に showsMenuAsPrimary Actionをtrueに設定したい これも意味的には ポップアップボタンが 行うことだからです しかし どうでしょう? ボタンは変わりません 実は変わっています もう1つのトグルボタンが できました しかし デフォルトはオフです
非nullのメニュープロパティが 消えています これはMac Catalystで 新たにポップアップを 表示させるために 重要なことです これでメニュー設定したので ポップアップボタンは は完全に機能しています
最後に大きなパネルのような トグルボタンにご注目を iPadスタイルのボタンが 空間に合わせてーー 伸びることを利用した レイアウトです Macのボタンでは このような動作はありません トリッププランナーが Mac用に最適化されても iPadでの動作を 維持することができました その方法を紹介します まず 別のボタンの 構成から始めました
その後 設定を使って 画像をセットしましたが 画像用ボタンの状態を 特別に設定する必要はない
.padの行動スタイルを 指定すると iPadでのレイアウト動作が iPadのようになります ボタンの背景がフレームに 合わせて伸びるということだ
シンボルはもう少し 大きくする必要があったので ボタンのポイントサイズを 大きくしました
changesSelectionAsPrimary Actionをtrueに設定し ボタンのisSelected プロパティに基づいて 選択された色と 選択されてない色を指定する colorUpdateHandlerを 用意しました
このような新たな選択肢に ワクワクしますよね UIButtonのAPIの 古くからある顔ぶれと 新しいプロパティは 様々な方法を組み合わせて たくさんのボタンを 作ることができーー これらはすべて Macでも適用できます トリッププランナーの機能で 最後に紹介するのは印刷です Catalystに内蔵された 新しいキーコマンドにより 印刷が今まで以上に 簡単になりました トリッププランナーでの 印刷体験は レスポンダチェーンを使用し 印刷処理に最適な オブジェクトを選択すると 向上させることができました 実演してみましょう 最新版トリッププランナーに 戻りましょう スペインで1番好きなーー レストランを選択します マップビューはCatalyst独自の ズームコントロールを クリックして操作します
すると アプリのフォーカスと 初期対応のステータスは 詳細ビューコントローラーに 移動しました メニューでファイル印刷を 選択すると プリントダイアログが 表示されるのですが...
この1点だけ プリントしましょう あとはグエル公園と バルセロナホテルを選んで その日の計画を完成とします
内蔵のショートカット command+Pを使って印刷します
表示された 印刷ダイアログでは 選択した3つの項目すべて 印刷するはず…
現在の詳細ビュー コントローラー以外もです 最後に サイドバーの国に Shift+Tabでフォーカスし 補足表示や詳細ビュー コントローラーで 何も選択していない場合は…
そして 印刷しようとすると トリッププランナーは何を すべきか分かっていてーー サイドバーで選択した アイテムをすべて印刷します
では 手順を説明します ジェイソンが紹介した 新しいinfo.plistキーを設定 トリッププランナーが印刷し メニューに追加することを システムに 知らせなければなりません 詳細ビューコントローラーは UIResponderの2つの方法を オーバーライドしています プリントコンテンツは 実際の印刷を行い UIKitはこのアクションを 実行できるオブジェクトを レスポンダチェーンの中で 実行できる アプリケーションの ビジネスロジックによっては 詳細ビューコントローラーが 印刷しない場合もあります
そこで canPerformActionの 手法を使って 詳細ビューコントローラーが 印刷できるかーー レスポンダチェーンに 知らせています これはprintContentの前に 呼び出されーー falseを返した場合 UIKitがそのアクションが できるオブジェクトを探して レスポンダチェーンを遡るため 詳細ビューコントローラーは スキップされます アプリのルートビュー コントローラーである レスポンダチェーンの 最上位に位置するーー BrowserSplitView Controllerに もう一つのUIResponder メソッドを実装しました targetForAction:withSender これにより スプリットビュー コントローラーは どのオブジェクトが 印刷するか選択できます これはユーザーの選択や ビジネスロジックによって あるページを印刷する 必要はあるが その特定の印刷を 実装するオブジェクトがーー レスポンダチェーンに 含まれてない場合に便利です このシナリオで使用すると アンチパターンとなるーー becomeFirstResponder を そのオブジェクトに 送信して そのオブジェクトを レスポンダーチェーンに 強制的に組み込むよりも はるかに良い方法です 印刷については以上です 自力で旅行できそうです このビデオではジェイソンが 新しいMac Catalyst APIと 強化されたMac Catalyst APIを紹介しました これは皆さんがMacに アプリを入れる際に 今まで以上に役立つものです そしてトリッププランナーでの 使い方を紹介しました ほとんどの場合 単なる 新しいプロパティであり 1行で設定できーー Macの真髄ともいえる機能を Catalystアプリに 導入することができます 皆さんも試してみてください ちょっとしたコードの変更で 皆さんの Mac Catalystアプリが 大幅に改善されます 視聴してくれて ありがとう [パーカッシブな音楽]
-
-
2:26 - Push Button
let button = UIButton(type: .system)
-
2:29 - Toggle Button
let button = UIButton(type: .system) button.changesSelectionAsPrimaryAction = true
-
2:40 - Pull-down Menu
let button = UIButton(type: .system) button.menu = UIMenu() button.showsMenuAsPrimaryAction = true
-
2:48 - Pop-up Button
let button = UIButton(type: .system) button.menu = UIMenu() button.showsMenuAsPrimaryAction = true button.changesSelectionAsPrimaryAction = true
-
3:50 - UIToolTipInteraction
let toolTipInteraction = UIToolTipInteraction(defaultToolTip: string) view.addInteraction(tooltipInteraction)
-
4:06 - UIControl ToopTip
control.toolTip = "Enable updates"
-
4:44 - ToolTips: UILabel
label.showsExpansionTextWhenTruncated = true
-
4:52 - Printing APIs
<key>UIApplicationSupportsPrintCommand</key> </true>
-
5:44 - Print Support
func printContent(_ sender: Any?) { let printInteractionController = UIPrintInteractionController.shared ... }
-
6:01 - Window Subtitle
scene.subtitle = "My subtitle"
-
7:34 - Behavioral Style
let button = UIButton(configuration: config) button.preferredBehavioralStyle = .pad
-
7:43 - Window Tab Opt-Out
<key>UIApplicationSceneManifest</key> <dict> <key>UIApplicationSupportsMultipleScenes</key> <true/> <key>UIApplicationSupportsTabbedSceneCollection</key> <false/> </dict>
-
8:23 - UIPointerShape
UIPointerShape.beam(preferredLength:0 axis: .horizontal) UIPointerShape.beam(preferredLength:0 axis: .vertical)
-
8:33 - Hidden Cursor
UIPointerStyle.hidden
-
13:25 - Scene subtitles
let subtitle: String = "..." let scene: UIScene = ... scene.subtitle = subtitle
-
14:54 - ToolTips
// ToolTip Interaction let imageView: UIImageView = UIImageView(frame: .zero) let interaction = UIToolTipInteraction(defaultToolTip: "...") imageView.addInteraction(interaction) // ToolTips - Label Expansion Text let label: UILabel = UILabel() label.text = "..." label.showsExpansionTextWhenTruncated = true // ToolTips — On UIControls let switchControl = UISwitch() switchControl.toolTip = "..."
-
17:49 - Primary button
let submitButton = UIButton(type: .system) submitButton.role = .primary submitButton.setTitle("Submit", for: .normal)
-
18:06 - Toggle button with menu
// Toggle button with menu let toggleButton = UIButton(configuration: .filled(), primaryAction: nil) toggleButton.configuration?.title = "Points Multiplier" toggleButton.changesSelectionAsPrimaryAction = true toggleButton.menu = ... // Elsewhere... toggleButton.configuration?.baseBackgroundColor = .systemRed
-
19:09 - Plain, destructive button
let resetButton = UIButton(configuration: .plain(), primaryAction: nil) resetButton.configuration?.title = "Reset" resetButton.role = .destructive resetButton.tintColor = .systemRed
-
19:36 - Pop-up button
let popup = UIButton(type: .system) popup.changesSelectionAsPrimaryAction = true popup.showsMenuAsPrimaryAction = true popup.menu = ...
-
21:01 - iPad behavioral style toggle
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
-
24:21 - Printing
override func printContent(_: Any?) { ... } override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool { if action == #selector(self.printContent(_:)) { ... } else { return super.canPerformAction(action, withSender: sender) } } override func target(forAction action: Selector, withSender sender: Any?) -> Any? { switch action { case #selector(UIResponder.printContent(_:)): ... default: return super.target(forAction: action, withSender: sender) } }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。