FRMSKI開発ブログ

AWS、iOS、AR/VRなど開発メモ

Human Interface Guidelines③ - App Architecture / Accessibility まとめ&和訳

iOSアーキテクチャアクセシビリティについての和訳です。

Accessibility(アクセシビリティ

iOSは、視力喪失、難聴、およびその他の障害を持つユーザーに、幅広いアクセシビリティ機能を提供します。UIKitベースのアプリケーションは、ほとんど手間をかけずにアクセスできるようになり、より多くの人があなたのアプリケーションを使用し魅力的な体験を提供できるようになります。

インターフェイス要素の代わりのテキストラベルを提供

代替となるテキストラベルは画面上には表示されませんが、VoiceOverは画面上に表示されているものを音声で表現できるため、視覚障害のある人にとってナビゲーションが容易になります。

アクセシビリティの設定に対応

アプリがUIKitを使用してユーザーインターフェイスを実装する場合、テキストとインターフェイスの要素は、太字や大文字などの特定のアクセシビリティ設定に自動的に適応します。また、モーションを減らすオプションが有効になっている場合など、アクセシビリティの設定をチェックし、適切な場合には対応する必要があります。カスタムフォントを実装しているアプリは、システムフォントのアクセシビリティの動作と一致させる必要があります。

アクセシビリティ機能でテスト

アクセシビリティオプションは、テキストやモーションの変更に加えて、コントラストの変更、色の反転、透明度の低下などを行うことができます。これらの設定を有効にして、これらの機能を有効にしているユーザーのアプリがどのように表示され、行動するかを観察します。

クローズドキャプションと音声の説明を含む

クローズドキャプションは、聴覚障害者および難聴者が音声対話およびその他の可聴コンテンツをビデオで知覚することを可能にします。音声記述は、視覚障害者にとって重要なビデオコンテンツのナレーションを提供します。

コントラスト比

アプリのコントラストが不十分であると、誰もが読むことが難しくなります。たとえば、アイコンやテキストが背景と混ざることがあります。オンラインカラーコントラスト計算機を使用すると、アプリのカラーコントラストを正確に分析し、最適な基準を満たしているかどうかを確認できます。 4.5:1の最小コントラスト比を目指しますが、より厳しいアクセシビリティ基準を満たすため、7:1が好まれます。その他のデザインガイダンスについては、「Color - Visual Design - iOS - Human Interface Guidelines - Apple Developer」を参照してください。

Human Interface Guidelines② - Interface Essentials 和訳&まとめ

前回に引き続きHIGの和訳を紹介します。今回はインターフェース要素について。
前回の記事 → Human Interface Guidelines① - iOS 和訳&まとめ - FRMSKI開発ブログ

Interface Essentials(インターフェース要素)

ほとんどのiOSアプリは、共通のインターフェース要素を定義するプログラミングフレームワークであるUIKitのコンポーネントを使用して構築されています。このフレームワークにより、アプリケーションはシステム全体にわたって一貫した外観を実現すると同時に、高度なカスタマイズを提供することができます。 UIKit要素は、柔軟で親しみやすいものです。適応性があり、iOSバイス上で優れた単一のアプリケーションを設計できるようになり、システムが外観の変更を導入すると自動的に更新されます。 UIKitによって提供されるインタフェース要素は、3つの主なカテゴリに収まります。

Bars(バー)

あなたがアプリのどこにいるのかを伝え、ナビゲーションを提供し、行動を開始し情報を伝達するためのボタンやその他の要素を含めることができます。

Views(ビュー)

テキスト、グラフィックス、アニメーション、インタラクティブな要素など、アプリに表示される主なコンテンツを含みます。ビューは、スクロール、挿入、削除、配置などの動作を可能にします。

Controls(コントロール

行動を開始し、情報を伝える。ボタン、スイッチ、テキストフィールド、進捗インジケータはコントロールの例です。



UIKitは、iOSのインターフェースを定義するだけでなく、アプリが採用できる機能を定義します。たとえば、このフレームワークを使用すると、アプリはタッチスクリーン上のジェスチャーに反応し、描画、アクセシビリティ、印刷などの機能を有効にできます。

iOSは、Apple Pay、HealthKit、ResearchKitなど、他のプログラミングフレームワークや技術とも密接に統合されており、驚くほど強力なアプリケーションを設計することができます。

Human Interface Guidelines① - iOS 和訳&まとめ

AppleのHuman Interface Guidelineについて少しずつまとめたいと思います。今回はiOSのデザインテーマとデザイン原則について。

iOSデザインテーマ

下記はiOSが他のプラットフォームと区別される3つの違いです。

  1. Clarity(明快さ)
    見やすいテキスト、明瞭なアイコン、適切な装飾など機能性に優れたデザインである。空白や色、フォント、グラフィックなどのインターフェース要素は重要なコンテンツを強調しインタラクティブ性をもたらします。
  2. Deference(敬意)
    滑らかなモーションと鮮明で美しいインターフェイスは、人々がコンテンツを理解し対話することを助けます。コンテンツは通常、画面全体を満たしますが、透過性とぼかしが多くのヒントになります。最小限に抑えたベゼル、グラデーション、およびドロップシャドウが、インターフェイスを確実で軽快にし、コンテンツを最高の状態に保ちます。
  3. Depth(奥行き) 明確なビジュアルレイヤーと現実的なモーションは、階層を伝え、活力を与え、理解を促進します。タッチと発見可能性が喜びを高め、文脈を失うことなく機能と更なるコンテンツへのアクセスを可能にします。また遷移は、コンテンツをナビゲートする際の奥行きを提供します。

デザイン原則

Aesthetic Integrity(審美的な誠実さ)

 審美的な整合性は、アプリの外観と振る舞いがその機能とどれだけうまく統合されているかを表します。たとえば、人々が深刻な作業を行うのを助けるアプリは、緻密で控えめなグラフィックス、標準コントロール、予測可能な挙動を用いることで、彼らを集中させておくことができます。一方、ゲームなどの臨場感あふれるアプリは、魅惑的な外観を提供し、楽しみと興奮を約束し発見を促します。

Consistency(一貫性)

 一貫したアプリケーションは、インターフェイス要素、既知のアイコン、標準的なテキストスタイル、統一された用語を用いて使い慣れた標準と認識を実装します。このアプリは、人々が期待する方法で機能や挙動を組み込んでいます。

Direct Manipulation(直接操作)

 画面上のコンテンツを直接操作することで、人々が関わり理解することを促進します。ユーザーは、デバイスを回転させたり、ジェスチャーを使用して画面上のコンテンツに影響を与えることで直接的な操作を経験します。直接操作を介して、彼らは即座に自分の行動の結果を見ることができます。

Feedback(フィードバック)

 フィードバックは行動を認識し結果を示すことで人々に情報を提供します。内蔵のiOSアプリは、すべてのユーザー操作に対応して認識可能なフィードバックを提供します。インタラクティブな要素は、タップすると簡単にハイライトされ、進行状況インジケータは長時間実行される操作の状態を伝え、アニメーションとサウンドはアクションの結果を明確にします。

Metaphors(メタファー)

 実世界やデジタルの世界に根ざしているかどうかに関わらず、アプリの仮想オブジェクトやアクションが使い慣れた体験の隠喩(メタファー)であることで、より迅速に学習できます。メタファーはiOSで頻繁に機能します。なぜなら、人々は物理的に画面とやり取りするからです。彼らは、下のコンテンツを表示するために視点を移動します。コンテンツをドラッグしてスワイプします。スイッチの切り替え、スライダの移動、ピッカー値のスクロールを行います。本や雑誌のページをめくります。

User Control(ユーザーコントロール

 iOS全体では、アプリではなく人がコントロールしています。アプリは、行動のコースを示唆するか危険な結果について警告することはできますが、意思決定をすることはありません。最高のアプリは、ユーザーを有効にし、望ましくない結果を避けることの間で、適切なバランスを見つけます。アプリは、インタラクティブな要素を使い慣れた状態に保ち、破壊的な行動を確認し、進行中に操作が中断しても取り消すことができるため、ユーザーにコントロールしているような感覚を持たせることができます。

次回はインターフェース要素について和訳したいと思います。

ライブラリ管理ツールCocoaPodsの使い方

CocoaPodsはiOSアプリ開発に使用するライブラリ管理ツール。今回はインストール手順をご紹介します。

ruby gemを最新に

まずはMacにはデフォルトで入っているRubyを最新のバージョンにアップデートします。

$ sudo gem update --system

②CocoaPodsをインストール&セットアップ

下記コマンドでインストールします。

$ sudo gem install cocoapods

インストール後はセットアップ

$ pod setup
Setting up CocoaPods master repo
Setup completed (read-only access)

③Pod initでPodfileを作成

CocoaPodsを使うプロジェクトフォルダへ移動します。

$ cd ~/TestPJT

initでPodfileを作成。

$ pod init

④生成されたPodfileにインストールしたいライブラリを記述

$ vi Podfile

Podfileをviで編集して下記のようにインストールしたいライブラリを記述します。

platform :ios, "12.0"
pod 'RxSwift'

⑤pod installを実行してworkspaceを開く

$ pod install

プロジェクトフォルダにTestPJT.xcworkspaceが生成されるのでこれで完了。
以上、CocoaPodsの使い方でした。CocoaPods便利なのでアプリ開発には必須です。

RxSwiftの基本を学ぶ

RxとはReactive Extensionsの略で非同期処理やイベント処理などを宣言的に記述することができる便利なライブラリです。 RxのSwift実装なのでRxSwiftと言います。

インストール方法

pod 'RxSwift'をPodfileに記述しpod installでインストールできます。

Observableで通知を受け取る

ObservableはRxSwiftの基本となる考え方でプロパティを監視するためのクラスです。通知するものは以下の3つ。

種類 説明
onNext 通常のイベントを送る。複数回可能。
onError エラーの発生を通知する。発生後はイベントが発生しない。
onComplete 完了を通知。発生後はイベントが発生しない。

これらのイベントは下記のようなMarble Diagramという図で表されます。
f:id:frmski:20181011165814p:plain:w300
f:id:frmski:20181011165820p:plain:w300
丸がonNext、縦棒がonComplete、バツがonErrorです。

Subjectでイベントを発行する

RxではPublishSubjectというものがあり、これはObservableと同じ機能を持っています。

その他のSubject

BehaviorSubject

BehaviorSubjectはsubscribe時に、一つ過去のevent(最初にsubscribeする場合は初期値)を受け取れるSubject。

ReplySubject

ReplaySubjectはオブザーバがいつサブスクライブするかに関わらずソースObservable(s)が送信した全てのアイテム(イベント)をオブザーバに送信する。

Variable

VariableはBehaviorSubjectをラップする。BehaviorSubjectに対しての利点は、Variableは明示的に complete または error になることがない。また、Variableはdeallocated時に自動的に完了する。

まとめ

まだまだ使いこなすと便利な機能がたくさんありますので、応用編も近いうちに書きたいと思います。

参考サイト

オブザーバーパターンから始めるRxSwift入門
【Swift】RxSwiftのPlaygroundを読む②
RxSwift 入門 その2 - タコさんブログ
【iOS Swift入門 #299】[RxSwift]バインドできるプロパティを作成する - Swift,Objective-Cプログラミング ~ iOS ~

報酬をコントロールしてモチベーションを保つ方法

認知科学や心理学を通したモチベーションを保つ方法について、ソフトウェア開発や仕事にも役立ちそうなのでまとめてみました。

目標に近づくほど「ヤル気」が出る

  • 目標に向かって進む時、「すでに完了したものに注目する」よりも「残されているものに注目」した方がヤル気が出る。
  • 目標が達成されるとヤル気が急速に落ち込む→「報酬後初期化」
  • 報酬を獲得した直後が、顧客が離れていく危険性がもっとも高い

報酬に変化がある方が強力

  • 固定条件よりも変動条件による報酬の方がヤル気が出る(固定条件と変動条件の平均報酬値は同じ)
  • オペランド条件付けを機能させるためにはユーザーが本当に求めるものを理解する必要がある

ドーパミンによる探究心

  • ドーパミンが最も放出されるのは報酬を得た時よりも報酬を期待している時
  • 情報を探索している時はドーパミンが出ている
  • ドーパミンループ」→情報が少量づつもたらされる時(Twitterなどの文字制限)はドーパミンが最も活性化され、さらに情報を求めてしまう
  • 情報の到着が予測不能であるほど、人はその情報の探索にのめり込む

「内的報酬」と「外的報酬」

  • 「外的報酬」→前もってきちんと説明されている特定の行動に対する報酬
  • 「内的報酬」→達成感など、給料などの外的報酬ではないもの
  • 外的報酬の場合、予期せぬ報酬の方が効果的

競争意欲によるヤル気

  • ライバルが少ない方が競争意欲は増す
  • ライバルが10人以上いることがわかると、競争意欲が低下する

習慣によるヤル気

  • 簡単にできる小さなノルマを習慣化する
  • 2日以上サボると習慣化に遅れが生じる

まとめ

以上、ヤル気をコントロールする方法についてまとめてみました。ゲーミフィケーションの考え方に近いです。ドーパミンをうまくコントロールすれば大ヒットゲームを生み出すこともできるのかもしれません。

SCNPhysicsBodyのプロパティ一覧

SceneKitの物理シミュレーションはSCNPhysicsBodyを使えば簡単に実装することができます。物理演算を正確に制御するためには重力や摩擦についてのプロパティを正確に知ることが重要です。
下記表でSCNPhysicsBodyのプロパティを一覧にしてまとめてみました。

プロパティ名 データ型 説明
mass CGFloat ボディの重力、キログラム単位
charge CGFloat ボディの電荷、磁力による外圧を使用する際に使う
friction CGFloat ボディ移動時の摩擦
rollingFriction CGFloat ボディ回転時の摩擦
dumping CGFloat 移動摩擦による減衰
momentOfInertia SCNVector3 ボディの慣性、ボディを持つノードのローカル座標系で表される
useDefaultMomentOfInertia Bool SceneKitで定められたmomentOfInertiaの値を使うかどうか
centerOfMassOffset SCNVector3 ローカル座標を原点としたボディの重心