ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
UIKitとAppKitにおけるSF Symbols
SF Symbols 3 でカラー化されたシンボルを作成し、Appのインターフェースのビジュアルデザインに合わせてカスタマイズする方法を説明します。カラー化されたシンボルを統合するための最新のUIKit APIとAppKit API、および実装のためのベストプラクティスを紹介します。 このセッションを最大限活かしていただくためには、WWDC19の「SF Symbolsの紹介」をご確認いただくことをお勧めします。
リソース
関連ビデオ
WWDC21
-
ダウンロード
こんにちは!私 Tomが 「UIKitとAppKitにおけるSF Symbols」 をお届けし App内でSF Symbolの 新機能を活用する方法を伝授します まずは色に関する設定と その活用法をご紹介します 次に設定を組み合わせて 自在な演出をする方法 最後は カラーシンボルを 属性付き文字列と併用してみます なお 新APIはAppKit UIKitで 共通なので説明する手順は フレームワークの微妙な誤差を除き 双方に対応しています 新機能はSF Symbolsの色付けに関わり macOS11でAppKitがマルチカラーを加えた後 iOS 15でUI Kitも追随します 今年はSF Symbolsの レンダリングに新モードが加わり 全てのプラットフォームに対応しています 新しいレンダリング方式は デザインのレイヤーごとに 色を変えるもので このレイヤーはヒエラルキー つまり階層ごとに役割が決まります 1:primary 2:secondary 3:tertiaryの 3つのレイヤーがあり
iOSで新仕様を使う際は 専用のテンプレートでデザインします macOSの場合は 自動的に 正しいテンプレートが選ばれます
SF Symbolsについては 「Introducing SF Symbols」を 2019年版にてご覧ください 最初に見ていくレンダリング方式は 単色シンボルです これは「ボイスメール」 UI上にシンボルがいくつかあります 単色のシンボルが一つ 他の方式のシンボルもいくつかありますが まずは単色シンボルを勉強し 他のシンボルは後に残しましょう
名前の通り 単色シンボルは一色のみで パステルやアクセント色が多いです 単色シンボルを配置するには 新しいシンボルを作成 イメージビューにして Tintかアクセント色に設定 これは以前と変わらず 単色がデフォルトなので 追加設定も必要ありません iOS15 macOS11以前は 単色が唯一のレンダリング方式でした 色を設定するにはイメージビューより Tintやアクセントを選択するのみ 既存の単色モードは これでよしとして新モードの 階層モードを見ていきます Macで使われている階層シンボルとしては コントロールセンターのアイコンがいい例で 複数の箇所で使っていますが 「ディスプレイ」のものを見ていきましょう
中央のスイッチや デバイス一覧のアイコンなど いくつも使用されています デバイスはスイッチに比べ アイコンの濃度が高い これが階層の効果です
階層モードは レイヤーに割り当てた階層から色を決め 第一レイヤーの色は設定のまま 第二 第三レイヤーになると 同じ系統色を維持しつつ 濃度を徐々に下げるのです
階層など 色付けのモードは 現行の設定と同系統の 設定方法を利用し imageViewにて 画面通り設定をすれば シンボルは階層色になります 階層色のカラースキームは 一つの色を基にしておりそこから 濃度を下げて他の階層の色とします レイヤーの割り当ては重要で 1つ欠けている場合 そのレイヤーの色は使用されません
さらに パレットという色付け方式もあり 階層モードと似ていますが 異なる点もあります 「ボイスメール」を例としましょう 右側のボタンはどれも複数色で 互いに違う色になっています 手順を踏み複製してみましょう
目当てのシンボルを まずは初期化し 新しいボタン設定を作成します でも このシンボルだけでは不十分です 円の中に配置し色を塗る必要があります
以前は修飾子をシンボルに 追加して行いましたが 今はイメージバリアントが主流 イメージバリアント使用の際は 手動でシンボル名を変更せずに イメージの類型をリクエストできます まず シンボルを円で過去み
円の中を塗りつぶします
ボタンコンテナビューで 類型をN読み込んでいるため すべてのボタンに修飾が加わります 類型がない場合は 元々のシンボルが使用されます 類型についての指定は 階層を下って伝達され イメージビューに働きかけます
シンボル自体は準備OK でも シンボルの色はどう指定するのでしょう まずはパレットの色を指定する 新たなシンボル設定を作成 階層モードと同様 階層に色が割り当てられますが ここは濃度を変えた派生色でなく あらかじめ指定した色を使います またパレットの色に Tintという新種の色を使いますが ビューは自動的にTintカラーを 適切なレイヤーに割り当てます
次のボタンも同じ要領です ベースのシンボルを読み込み色を決め ボタン設定に適用します これで見本と同じように見えますが 後に述べる通りまだ不十分です
最後のボタンも 色が違うだけで同じパターン でも なぜわざわざ 「白」と指定するのでしょう 単色シンボルを使い 一色で塗ってもいいのでは? 答えは「ノー」です以前不十分だと述べた 理由でもあります シンボルの内側は白だと 決まっている場合 今までは単色モードでも 偶然正しい色に 反映されていました でもそれはライトモードだから ダークモードにすると 単色シンボルは使えません 単色の場合内側部分は 抜き = アウトラインとなり 背景色が抜けて表示されてしまいます パレットモードを使えば どんなUIでも統一された シンボルを表示できます
tintColorという新色を 紹介しましたがこれは ビューの色のTintで解決するもので レイヤーの色を指定する際特に役立ちます また 色付け可能なら どのような環境でも使うことができます ダイナミックカラーについての規則は 依然 適応されますが
ダイナミックカラーについてはWWDC19の 「iOSのダークモード」に詳しくあります ではレイヤーが2つしかない 例えば 第2レイヤーがない シンボルの場合パレットを どう適応するのでしょう
第一レイヤー第三レイヤーのみの デバイスシンボルがいい例です
iPadシンボルを二色で埋めるわけですが それでも3レイヤー分 色を割り当てることが可能です
第二レイヤーがないため ここでは第二色を使いません ただ終始2レイヤーしかない シンボルの場合は 設定で2色のみ設定し 二つのレイヤーに階層順で 色を割り当てられます
それでも レイヤーの数が バラバラな場合は 3色設定の方が 正確に色を 割り当てられるためおすすめです
2色指定は2レイヤーのみの シンボルなら 簡便になりおすすめです
パレットモードは シンボルの階層ごとに使う色を 自分で設定する点が 階層モードと異なり 派生色を割り当てることはありません ただ 階層モードと同様に レイヤーの階層は大事になります 3レイヤー以下の シンボルの場合簡便なモードが他にあり 今からご紹介するマルチカラーが当たります 前述の通りこのモードは 昨年AppKitとSwiftUIに導入され UIKitには今年導入しました
複数色のシンボルが使われていますね これがマルチカラーです 配置に 取り掛かりましょう
まずはセルごとにイメージを読み込みます ただ 今は初期状態で 単色シンボルがデフォルトです
マルチカラーシンボルを指定するには マルチカラーの類型を リクエストしビューに割り当てる 以上の設定を行います
でも 無変化のものもあり これはマルチカラーに未対応だからです 対応・未対応を 確認するにはどうするのでしょう SF Symbols Appを開けばこれは簡単 シンボルを検索しインスペクタで シンボルの対応するモードを確認します 例えば「flame」は単色のみ対応 「lung 肺」は4モード全てに対応しています
また ここで加工をすれば プログラムなしでも シンボルの見た目が 分かるようになります 例に戻りましょう
マルチカラー未対応の場合 tintColorを手動で設定し シンボルを直します
マルチカラーシンボルには ダイナミックカラーを使うため 背景色に影響されるものがあり 逆にそれ以外は影響されません 例ではダイナミックカラーが 未使用なので無影響です
設定名から分かるように マルチカラー設定は マルチカラー限定でなく優先という意味で 未対応シンボルに 配慮しています マルチカラー設定を 他の設定と合わせることも可能で これは後ほど説明します マルチカラーの場合 対応するシンボルはマルチカラー 未対応のシンボルは他のモードになります 階層・パレットモードを組み合わせると 効果が相反するのでその場合 後付けの方が適用されます このモードも\未対応の場合は 単色モードを使います
マルチカラーで割り当てた色は プログラムでは改変ができず tintなどダイナミックカラーを使い レンダリングする部位も存在し得ます ダイナミックカラーの場合加工は不要 表示の際 ビューを踏まえ 色が自動的に決まります
4つの色設定とコード上の 操作については以上です ではInterface Builderでも使えるか 嬉しいことにその通りです XcodeはIDEのレンダリングを 似た方式で導入しています
Planets Appの ストーリーボードですが 色のレンダリング方式が 指定できるよう拡張されました また新しい色付け設定は 過去の設定と併用可能です IBの新仕様については 「スタイルによるインタフェース構築」 に詳しくあります 色付けのモードを 一つ一つ扱ってきましたが 他の設定との併用は可能でしょうか これは幸い簡単にできます ショートカットAppにて 例を見ていきましょう アイコンは通常より大きくなり レンダリングは 階層モードのようです なのでポイント数の設定と 色付けの設定の双方が必要となります
しかし 1つのみが適応可です どう融合するのでしょう 実は簡単な方法があり 二つの設定をまとめながら 双方の内容の維持が 可能になります
この例では ポイント数指定と階層色指定の 2つの設定を作成し
applyingメソッドで組み合わせたものを 最終的な設定とします イメージビューに適用され きちんと作用していると分かります この手順は 色の設定に限らず フォントとウェートを 設定したりと 応用自在です
設定の混合についてでした 最後の題目は 属性付き文字列との併用です この架空のAppは ホテルと その空き情報を まとめるもので テキストとシンボルを 組み合わせた部分があります まずは アメニティー欄に テキストを入力しましょう 単純ですが 少し複雑かもしれません 属性付き文字列を作ってから
色を設定しシンボルを読み込みます 今回は階層モードを 使用します
このシンボルを使い アタッチメントを作成 これで 文字列を仕上げます アメニティごとに繰り返します テキストが載る 項目では 正しいフォントと 階層モードで指定した 色を指定します
単色の場合自動的に選択できますが 多色シンボルの場合は 色を指定しなければなりません ただ 文字のサイズは単色同様 自動的に選択します
これを行うと色・大きさ・内容が 思い通りになります 文字列とのマッチングのおかげです
今年は単色の色モードに加え 3モードをSF Symbolsに導入 Appでの活用法をご紹介し スマートなアイコン表示を可能としました 色付きシンボルは さらに世界を拡げるものです
この動画をお楽しみいただいたら 関連題材を扱った 「SF Symbolsの新機能」で 新仕様の一望をまた 「SwiftUIにおけるSF Symbols」で SwiftUIにおける 活用法をご覧になれます ご視聴 ありがとう! App造り 応援します! [陽気な音楽]
-
-
1:52 - Monochrome symbols
// Play let playImage = UIImage(systemName: "play") playImageView.image = playImage playImageView.tintColor = .systemBlue
-
3:00 - Hierarchical symbols
// Device image var image = NSImage(systemSymbolName: "ipad.landscape", accessibilityDescription: "iPad") let config = NSImage.SymbolConfiguration(hierarchicalColor: .label) deviceView.image = image deviceView.symbolConfiguration = config
-
4:13 - Setup button configurations
// Initialize button configuration let speakerConfig = UIButtonConfiguration.plain speakerConfig.image = UIImage(systemName: "speaker.wave.2") let callConfig = UIButtonConfiguration.plain callConfig.image = UIImage(systemName: "phone") let deleteConfig = UIButtonConfiguration.plain deleteConfig.image = UIImage(systemName: "trash")
-
4:40 - Image variants
// Button container view actionsView.imageVariant = .none
-
4:44 - Image variants
// Button container view actionsView.imageVariant = .circle
-
4:51 - Image variants
// Button container view actionsView.imageVariant = .circle.fill
-
5:09 - Speaker button color configuration
// Speaker button color configuration let config = UIImage.SymbolConfiguration(paletteColors: [.tintColor, .systemGray2]) speakerConfig.preferredSymbolConfigurationForImage = config speakerButton.configuration = speakerConfig
-
5:40 - Call button color configuration
// Call button color configuration let config = UIImage.SymbolConfiguration(paletteColors: [.white, .tintColor]) callConfig.preferredSymbolConfigurationForImage = config callButton.configuration = callConfig
-
5:56 - Delete button color configuration
// Delete button color configuration let config = UIImage.SymbolConfiguration(paletteColors: [.white, .systemRed]) deleteConfig.preferredSymbolConfigurationForImage = config deleteButton.configuration = deleteConfig
-
6:10 - Colors matter
// Colors matter! let config = UIImage.SymbolConfiguration(paletteColors: [.tintColor, .systemGray2]) let config = UIImage.SymbolConfiguration(paletteColors: [.white, .tintColor]) let config = UIImage.SymbolConfiguration(paletteColors: [.white, .systemRed])
-
6:46 - Tint color
view.backgroundColor = .tintColor label.textColor = .tintColor searchField.tokenBackgroundColor = .tintColor tabBarItem.badgeColor = .tintColor
-
9:03 - Multicolor symbols
// configure table view cell let image = UIImage(systemName: category.iconName) cell.imageView.image = image
-
9:13 - Multicolor symbols
// configure table view cell let image = UIImage(systemName: category.iconName) let config = UIImage.SymbolConfiguration.preferringMultiColor let tintColor = category.colorForIcon cell.imageView.image = image cell.imageView.preferredSymbolConfiguration = config cell.imageView.tintColor = tintColor
-
9:58 - Multicolor symbols
// configure table view cell let image = UIImage(systemName: category.iconName) let config = UIImage.SymbolConfiguration.preferringMultiColor let tintColor = category.colorForIcon cell.imageView.image = image cell.imageView.preferredSymbolConfiguration = config cell.imageView.tintColor = tintColor
-
12:25 - Combining configurations
// combined configuration let image = UIImage(systemImage: "ipad.and.iphone") headerView.image = image
-
12:40 - Combining configurations
// Combined configuration let image = UIImage(systemImage: "ipad.and.iphone") headerView.image = image let fontConfig = UIImage.SymbolConfiguration(pointSize: 60, scale: .large) let colorConfig = UIImage.SymbolConfiguration(hierarchicalColor: .systemBlue) let config = fontConfig.applying(colorConfig) headerView.preferredSymbolConfiguration = config
-
13:20 - Symbols in attributed strings
// Hotel amenities let amenitiesString = NSMutableAttributedString(...) if (room.amenities.contains(.tv)) { let config = UIImage.SymbolConfiguration( hierarchicalColor: .systemGreen) let tvImage = UIImage(systemImage: "tv", withConfiguration: config) let attachment = NSTextAttachment(image: tvImage) let attachmentString = NSAttributedString(attachment: attachment) let tvString = attachmentString.mutableCopy() tvString.append(NSAttributedString(" TV, ") amenitiesString.append(tvString) }
-
13:51 - Symbols in attributed strings
// hotel amenities let amenitiesLabel = UILabel() amenitiesLabel.textColor = .systemGreen amenitiesLabel.font = UIFont.systemFont(ofSize: 25) amenitiesLabel.attributedString = amenitiesString
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。