iOS 7 UI移行ガイド(4)〜UIの更新(1)〜外観と動作

2013. 09. 27
※公式日本語ドキュメント『iOS 7 UI 移行ガイド』が公開されていますので、そちらを読むことを推奨します。



外観と動作

iOS 7は、貴方のUIのレイアウトと外観のカスタマイズをする方法にいくつかの変更をもたらします。
ビューコントローラのレイアウト、淡彩、そしてフォントの変更は、アプリケーション内の全てのUIKitオブジェクトに影響を与えます。
更にGesture Recognizer APIへの拡張は、ジェスチャの相互作用により詳細な制御を与えます。



ビューコントローラの使用

iOS 7では、ビューコントローラはフルスクリーンレイアウトを使用しています。
同時にiOS 7ではビューコントローラがビューをレイアウトする方法をより細かく制御することができます。
具体的にはフルスクリーンレイアウトの概念では、ビューコントローラがビューの各エッジのレイアウトを指定することができるように改良されました。

ビューコントローラのwantsFullScreenLayoutプロパティはiOS 7では非推奨です。
現在wantsFullScreenLayout = NOと指定している場合、iOS 7で実行した時にビューコントローラは予期しない画面の位置にコンテンツを表示する場合があります。

ビューコントローラがビューのレイアウトする方法の調整には、UIViewControllerが以下のプロパティを提供しています。

  • edgesForExtendedLayout

    edgesForExtendedLayoutプロパティは、矩形の4辺のそれぞれ指定に加え、noneやallの指定にUIExtendedEdge型を使用します。

    ビューの端を拡張するには、バーの透明度に関係無くedgesForExtendedLayoutを使用してください。
    デフォルトでは、このプロパティの値はUIRectEdgeAllです。

  • extendedLayoutIncludesOpaqueBars

    設計に不透明なバーを使用している場合、extendedLayoutIncludesOpaqueBarsプロパティをNOに設定することによってedgesForExtendedLayoutを改良します。
    (extendedLayoutIncludesOpaqueBarsのデフォルト値はYESです。)

  • automaticallyAdjustsScrollViewInsets

    スクロールビューのコンテンツの挿入が自動的に調整されるようにしたくない場合は、automaticallyAdjustsScrollViewInsetsをNOに設定します。
    (automaticallyAdjustsScrollViewInsetsのデフォルト値はYESです。)

  • topLayoutGuide、bottomLayoutGuide

    topLayoutGuideとbottomLayoutGuideプロパティは、ビューコントローラのビューで最上部または最下部のバーの端の位置を示します。
    バーがビューの最上部または最下部に重なる必要がある場合は、topLayoutGuideの最下部またはbottomLayoutGuideの最上部に制約を作成することによって、バーに相対的なビューを配置するためにInterface Builderを使用することができます。
    (ビューにバーが重なってはならない場合は、topLayoutGuideの最下部がビューの最上部と同じで、bottomLayoutGuideの最上部がビューの最下部と同じにします。)
    要求された時、両プロパティが遅延生成されます。

iOS 7では、ビューコントローラはビュー間のカスタムのアニメーション化された遷移をサポートすることができます。
さらにアニメーション化された遷移中にユーザとの対話をサポートするために、iOS 7のAPIを使用することもできます。
詳細は『UIViewControllerAnimatedTransitioning Protocol Reference』と『UIViewControllerInteractiveTransitioning Protocol Reference』を参照してください。

iOS 7では、ビューコントローラがアプリケーションの実行中にステータスバーのスタイルを調整する能力を提供しています。
動的にステータスバーのスタイルを変更する良い方法は、preferredStatusBarStyleを実装して、(アニメーションブロック内で)ステータスバーの外観を更新し、setNeedsStatusBarAppearanceUpdateを呼び出すことです。


ビューコントローラがステータスバーのスタイルを調整することを回避したい(そして代わりにUIApplicationのstatusBarStyleメソッドを使用することによってステータスバーのスタイルを設定する)場合は、アプリケーションのInfo.plistファイルにUIViewControllerBasedStatusBarAppearanceキーを追加し、値にNOを与えます。



淡彩の使用

iOS 7では、淡彩はUIViewのプロパティです。
iOS 7のアプリケーションはアプリケーション全体のUI要素用に、双方向性と選択状態を示すキーカラーの定義に淡彩を頻繁に使用しています。

ビュー用に淡彩を指定すると、淡彩は自動的にビュー階層内の全てのサブビューに伝播します。
UIWindowはUIViewから継承されているため、以下ようなコードを使用してウィンドウの淡彩プロパティを設定することによって、アプリケーション全体の淡彩を指定することができます。

window.tintColor = [UIColor purpleColor];

Tip
またInterface Builderでアプリケーションの淡彩を設定することができます。
FileインスペクタのInterface Builder Documentセクション内にあるGlobal Tintメニューで、Colorsウィンドウを開くか特定の色を選択することができます。

ウィンドウの淡彩を指定しない場合、システムのデフォルト色を使用します。

デフォルトではビューの淡彩はnilで、ビューがその親の淡彩を使用することを意味します。
また淡彩をビューに尋ねた時は、たとえ貴方が設定していない場合でも、常に色の値が返されることを意味します。

一般的には、ビューが画面外にある間にビューの淡彩を変更するのが最善です。
親の淡彩を使用してビューを元に戻すには、淡彩をnilに設定します。

重要
外観プロキシAPIを使用してのtintColorプロパティの設定は、iOS 7でサポートされていません。

アラートやアクションシートが表示された時、iOS 7は自動的に後方のビューの淡彩を薄暗くします。
この色の変化に対応するには、レンダリングでtintColorを使用しているカスタムのビューのサブクラスで適切な時にレンダリングを更新するために、tintColorDidChangeをオーバーライドする必要があります。


iOS 6では、tintColorはナビゲーションバー、タブバー、ツールバー、検索バー、およびスコープバーの背景を彩色します。
iOS 7でのバーの背景の彩色には、代わりにbarTintColorプロパティを使用します。



・フォントの使用

iOS 7はアプリケーションで見栄えの良いテキスト表示を簡単に作成するために、Dynamic Typeを導入しています。

最小サイズでのメッセージ 最大の非アクセシビリティ
サイズでのメッセージ
mail_message_7_2x_2013092623571872d.png message_large_2x_20130926235720c2b.png

Dynamic Typeを採用すると、以下の機能が得られます。

  • 全てのフォントサイズで文字間隔と行高を自動調整。

  • Body、Footnote、またはHeadlineなど、テキストの意味合いの異なるテキストのブロック用に異なるテキストスタイルを指定する機能。

  • Settingsで指定されているテキストサイズをユーザが変更した時に適切に応答するテキスト。

これらの機能を利用するには、ユーザがテキストサイズの設定を変更した時に送信された通知に応答するために準備をしておきます。
その後、貴方のUIで使用するために、新しいフォントの取得にUIFontのメソッドpreferredFontForTextStyleを使用します。
iOS 7は全てのサイズで最大限読み易くするために、このメソッドで指定されているフォントを最適化します。
テキストスタイルとアプリケーションで使用するフォントについての詳細は『Text Programming Guide for iOS』の『Text Styles』を参照してください。



・Gesture Recognizerの使用

iOS 7より前では、Gesture Recognizerが別のGesture Recognizerの失敗を必要とする場合、作成時に2つのオブジェクト間の永続的な関係の設定にrequireGestureRecognizerToFail:を使用します。
Gesture Recognizerがアプリケーション内(またはフレームワーク内)の他の場所で作成されておらず、Gesture Recognizerの設定が同じままである時、これは正常に動作します。

iOS 7では、UIGestureRecognizerDelegateは、Gesture Recognizerデリゲートオブジェクトによって実行時に指定するために障害要件を可能にする2つのメソッドを導入しています。  

  • gestureRecognizer:gestureRecognizer shouldRequireFailureOfGestureRecognizer:otherGestureRecognizer

  • gestureRecognizer:gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:otherGestureRecognizer


iOS 7ではクラス全体の障害要件を定義する能力を与えるために、(UIGestureRecognizer Class Referenceで説明されている)UIGestureRecognizerSubclassで類似したメソッドを導入しています。

どちらのメソッドでも、Gesture Recognizerデリゲートは認識を試みる毎に1回呼び出され、これは障害要件を遅延決定できることを意味します。
また別のビュー階層での認識の間に障害要件を設定できることも意味します。

動的な障害要件の状況の例としては、ビューに画面端からのパンジェスチャ認識を付加するアプリケーションで有用です。
この場合、他のRecognizerが認識処理を開始した後でキャンセルを取得した時に、発生する可能性があるグラフィックの不具合を防ぐことができるので、画面端のジェスチャ認識が失敗することを要求するために、ビューのサブツリーに関連付けされている他の全ての関連するGesture Recognizerが必要な場合があります。
これを行うには、次のようなコードを使用することができます。

UIScreenEdgePanGestureRecognizer *myScreenEdgePanGestureRecognizer;
...
myScreenEdgePanGestureRecognizer = [[UIScreenEdgePanGestureRecognizer alloc] initWithTarget:self action:@selector(handleScreenEdgePan:)];
myScreenEdgePanGestureRecognizer.delegate = self;
// Gesture Recognizerを設定し、ビューに添付します。
...
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    BOOL result = NO;
    if ((gestureRecognizer == myScreenEdgePanGestureRecognizer) && [[otherGestureRecognizer view] isDescendantOfView:[gestureRecognizer view]]) {
    result = YES;
    }
    return result;
}



参考文献

Apple/ iOS 7 UI Transition Guide

0 CommentsPosted in 資料

iOS 7 UI移行ガイド(3)〜移行のための準備(3)〜iOS 6のサポート

2013. 09. 23
※公式日本語ドキュメント『iOS 7 UI 移行ガイド』が公開されていますので、そちらを読むことを推奨します。



iOS 6のサポート

ビジネス上の理由でiOS 6以前のサポートを継続する必要がある場合、iOS 7用にアプリケーションを更新するために最も現実的な方法を選択する必要があります。
貴方が選択することができる技術は異なることがありますが、全体的なアドバイスは同じままです。
最初にiOS 7用のアプリケーションの再設計に焦点を当てます。
その後(ナビゲーションまたは構造の変更を含む再設計の場合)、(半透明バーや枠無しバーボタンなどiOS 7の設計要素を使用するための、アプリケーションのiOS 6バージョンの再スタイルが無いので)必要に応じてiOS 6バージョンへの変更を施します。


iOS 7を実行しているデバイス上では、たとえ現在貴方のアプリケーションが以前の外観を使用していたとしても、(警告や通知など)システムUIの全てがiOS 7の外観を使用します。



複数のアプリケーションのバージョンをサポートするためにInterface Builderを使用する

Xcode 5のInterface Builderは、以前のバージョンを継続してサポートしながら、iOS 7へのアプリケーションを変換するのに役立つ新機能が含まれています。

UIの更新によって以前のバージョンにどのような影響を及ぼすかのプレビューを取得してください。
アシスタントエディタを使用することで、キャンバス上でiOS 7のストーリーボードやxibファイルへの変更を加え、同時にファイルのiOS 6バージョンでそれらの変更がどのように見えるかを確認します。

以前のストーリーボードやxibファイルをプレビューする手順を以下に示します。

  1. キャンバス上でiOS 7のストーリーボードまたはxibファイルを見ながら、アシスタントエディタを開きます。

  2. Assistantのポップアップメニューを開きます。
    (Assistantのポップアップメニューは、アシスタントエディタのジャンプバーで前後の矢印の右側にある最初の項目です。)

  3. メニューでPreview項目にスクロールし、ストーリーボードまたはxibファイルを選択します。

    assistant_preview_2x.png

iOS 7とiOS 6.1以前でのアプリケーションのUIの表示を切り替えます。
アプリケーションがiOS 6.1以前をサポートする必要がある場合、アプリケーションの全てのバージョンでUIが正しく見えることを確認するために、この機能を使用します。

UIの2つのバージョンを切り替える手順を以下に示します。

  1. Interface BuilderでFileインスペクタを開きます。

  2. "View as"メニューを開きます。

  3. 表示するUIのバージョンを選択します。

Xcode 5での新しいInterface Builderの機能の詳細については『What's New in Xcode』を参照してください。



・標準アプリケーションの2つのバージョンをサポート

標準アプリケーションの両方のバージョンが同じようなレイアウトを持つ必要がある場合は、iOSの両方のバージョンで正確に動作するUIを作成するためにAuto Layoutを使用します。
iOSの複数のバージョンをサポートするために、Auto Layoutはストーリーボードやxibファイルでビューやコントロールを調整するために使用することができる制約の単一のセットを指定します。
(制約についての詳細は『Constraints Express Relationships Between Views』を参照してください。)

標準アプリケーションの両方のバージョンで同じようなレイアウトを使用し、且つAuto Layoutを使用しない場合はオフセットを使用します。
オフセットを使用するには、最初にiOS 7用にUIを更新します。
次に変更が以前のバージョンにどのような影響を与えるかのプレビューを取得するために、アシスタントエディタを使用します。
(プレビューを開くには、複数のアプリケーションのバージョンをサポートするためにInterface Builderを使用するで説明したように、AssistantのポップアップメニューのPreview項目を選択します)
その後、iOS 7におけるUI要素の新しい位置から、オフセットとして以前のUIでの各要素の原点、高さ、幅を定義する値を指定します。
例えば以下に示すテキストビューのy位置の場合、iOS 6のセグメンテッドコントロールの大きな高さを適応させるには、UIの以前のバージョンを18ポイントに変更する必要があります。

offsets_in_xcode_2x.png

Auto Layoutについての詳細は『Cocoa Auto Layout Guide』を参照してください。



・ハイブリッドアプリケーションでの複数の画像の管理

ハイブリッドアプリケーションは多くの場合、バーボタンアイコンや、バーまたは他のコントロールの背景ビューなどのカスタム画像のアセットを含みます。
アプリケーションは、これらのリソースを管理するために一つ以上のアセットカタログを使用することができます。
(アセットカタログについての詳細は『Asset Catalog Help』を参照してください。)


アセットカタログには、アプリケーション内で表示されるリソースが含まれています。
アセットカタログはアプリケーションアイコン、起動画像、または外部プロセスがアクセスする必要がある他の全ての画像は保持しません。

複数のiOSバージョンをサポートする必要があるハイブリッドアプリケーションでは、画像を自身で管理します。
アプリケーションのバージョンによって異なる画像は一意の名前を持つ必要があり、そうでない場合は両方のバージョンで同じ画像を使用することができます。

ストーリーボードやxibファイルに組み込まれた画像が含まれている場合は、イメージビューにアウトレットを作成し、必要に応じて適切なリソースを読み込むことを検討してください。
コード内で別のアセットを読み込む方法については、『条件付きリソース読み込み』を参照してください。



・条件付きリソース読み込み

いくつかの場合、貴方のアプリケーションが現在実行されているiOSのバージョンに、コード内で適切に対応できるかどうかを確認する必要があります。
例えば、アプリケーションの異なるバージョンでは著しく異なるレイアウトを使用している場合、各バージョン毎に異なるストーリーボードまたはxibファイルを読み込むことができます。
またバーの背景の淡彩にtintColorの代わりにbarTintColorを使用する場合など、APIの違いを処理するために異なるコードパスを使用する必要がある可能性があります。


iOS 7では、アプリケーションを実行しているiOSのバージョンに応じて異なる起動画像を使用することができます。
異なる起動画像を提供するには、Info.plistファイルにUILaunchImagesキーを追加し、各起動画像を記述するために辞書を使用します。
起動画像の処理についての詳細は、『iOSアプリケーションプログラミングガイド』のp.107『アプリケーションの起動(デフォルト)画像』を参照してください。

様々なアプリケーションのバージョンのために異なるリソースを読み込む(そしてInfo.plistファイル内での現在のストーリーボードまたはxibファイルを識別する)必要がある場合、現在のシステムバージョンを確認してapplication:didFinishLaunchingWithOptions:で適切なリソースを読み込むために、Foundationフレームワークのバージョンを使用することができます。

以下のコードは、Foundationフレームワークのバージョンをチェックする方法を示しています。

if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
    // Load resources for iOS 6.1 or earlier
} else {
    // Load resources for iOS 7 or later
}



参考文献

Apple/ iOS 7 UI Transition Guide

0 CommentsPosted in 資料

iOS 7 UI移行ガイド(2)〜移行のための準備(2)〜プロジェクトの適用範囲

2013. 09. 22
※公式日本語ドキュメント『iOS 7 UI 移行ガイド』が公開されていますので、そちらを読むことを推奨します。



プロジェクトの適用範囲

アプリケーションの互換性の要件とカスタマイズの特徴を知ることは、貴方が取る道筋のいくつかのアイディアを提供します。
プロジェクトのより詳細かつ適用範囲を確認するには、以下のチェックリストを使用します。



・全てのアプリケーションにおける必須事項

  • アプリケーションのアイコンを更新します。

    iOS 7では高解像度のiPhoneとiPod touch用のアプリケーションのアイコンは120 x 120ピクセルで、高解像度のiPad用のアプリケーションアイコンは152 x 152ピクセルです。
    (全てのアイコンサイズについての詳細は『アイコンと画像サイズ』を参照してください。)

    iOS 7はアプリケーションアイコンに光沢やドロップシャドウを適用しないことに注意してください。
    またiOS 7はアプリケーションアイコンに角丸のマスクをまだ適用しますが、iOSの以前のバージョンとは異なる角丸の半径を使用しています。

  • 既にそうしていない場合、起動画像はステータスバー領域を含むように更新します。

  • 既にそうしていない場合、全てのアートワークとデザインでRetinaディスプレイとiPhone 5をサポートします。


・全てのアプリケーションにおける推奨事項

  • アプリケーションのコンテンツが、(バーやキーボードなどの)半透明のUI要素や半透明のステータスバーを通して認識できることを確認してください。
    iOS 7では、ビューコントローラはフルスクリーンレイアウトを使用します。
    (詳細はビューコントローラの使用を参照してください。)

  • カスタムのバーボタンアイテムを再設計します。
    iOS 7では、バーボタンアイコンは軽量で異なるスタイルを持っています。
    いくつかの設計指針としてバーボタンアイコンを参照してください。

  • 貴方のレイアウトにおけるボタンの背景画像やベゼルの有用性を再評価することによって、枠無しボタンの準備をします。

  • (サイズや位置などの)ハードコーディングされたアプリケーションのUIの値は、システムが提供する値から動的に導出される値への置換を検討してください。
    レイアウト変更が必要な場合は、アプリケーションが応答するためのAuto Layoutを使用します。
    (Auto Layoutに慣れていない場合は、『Cocoa Auto Layout ガイド』を読んで学んでください。)

  • UIKitのコントロールやビューの測定基準やスタイルの変更が、アプリケーションのレイアウトや外観に影響を与える場所を検査します。
    例えばスイッチは広くなり、グループ化されたテーブルはもはや挿入できず、進捗ビューは薄くなっています。
    特定のUI要素についての詳細は、バーとバーボタンコントロールコンテンツビュー一時ビューを参照してください。

  • Dynamic Typeを採用します。
    iOS 7では、ユーザがアプリケーションで表示されるテキストサイズを調整することができます。
    Dynamic Typeを採用する場合、ユーザが指定したサイズの変更に適切に対応したテキストを取得します。
    詳細はフォントの使用を参照してください。

  • Control Centerを現すために、ユーザが画面の下部からスワイプアップすることを想定してください。
    iOSが画面の下部から開始されたタッチをControl Centerを現すべきものと判断した場合、現在実行中のアプリケーションへジェスチャを提供しません。
    iOSがControl Centerを現す必要の無いタッチだと判断した場合、タッチはアプリケーションに到着するまで若干遅れる可能性があります。

  • ドロップシャドウやグラデーション、ベゼルの使用を再検討してください。
    iOS 7の美学は洗練され且つ階層化されたもので(実物のように見えるUI要素の作成のために視覚効果を使用することは重要視されず)これらの効果については再考することを推奨します。

  • 必要な場合、(Auto Layoutやストーリーボードなど)iOS 6のための最善慣行にアプリケーションを更新し、アプリケーションが非推奨APIを使用していないことを確認してください。

貴方が現在行う必要がある事項のより良いアイディアを持つには、ビューコントローラの変更、淡彩、フォントについて外観と動作を読んで学んでください。



・iOS 6のサポートを継続する必要がある場合

iOS 6とiOS 7の両方をサポートする必要がある場合、アプリケーションが実行されているOSバージョンを検出し、適切なリソースを読み込むことができます。
詳細についてはiOS 6のサポートを参照してください。



参考文献

Apple/ iOS 7 UI Transition Guide

0 CommentsPosted in 資料

iOS 7 UI移行ガイド(1)〜移行のための準備(1)〜始める前に

2013. 09. 21
※公式日本語ドキュメント『iOS 7 UI 移行ガイド』が公開されていますので、そちらを読むことを推奨します。



始める前に

iOS 7では、枠無しボタンや半透明バー、ビューコントローラのフルスクリーンレイアウトなど、多くのUIの変更が導入されています。
Xcode 5を使用することで、iOS 7のプロジェクトをビルドし、iOS 7のUIでのアプリケーションの外観の第一印象を得るためにiOS 7シミュレータを実行することができます。

例えば、TheElementsサンプルプロジェクトの2つのバージョン間のみでの違いを、デプロイするターゲットとシミュレータで以下に示します。

iOS 7シミュレータでの
TheElementsサンプルアプリケーション
 iOS 6シミュレータでの
TheElementsサンプルアプリケーション
first_look_7_2x.png first_look_6_2x.png

アプリケーションの更新作業にそのまま取り掛かるのも魅力的ですが、処理を始める前に考えることがいくつかあります。

組み込みのアプリケーションで操作すると、iOS 7での変化が巧妙で深いことが明確になります。
慣れ親しんだUI要素は容易に認識できますが、見た目はとても異なっています。
視覚的なタッチの物性や現実性は洗練かつ弱められ、現実的な動きが向上しています。


iOS 7では全てのUI要素が異なって見えますが、貴方が精通しているUIKit APIはほとんどは同じままで、多くの新機能をサポートします。

探求を続けるには、iOS 7のメインテーマの理解から始まります。

  • 服従
    UIはユーザが理解し、コンテンツと対話する助けとなりますが、それと競合することはありません。

  • 明瞭
    テキストは全てのサイズで判読でき、アイコンは明確かつ明快で、装飾は希薄かつ適切であり、デザインの動機は機能を鮮明にすることに集中します。

  • 奥行
    視覚レイヤとリアルな動きは、ユーザの楽しみと理解を高めます。

基本的かつ普及しているiOSの体験に変化をもたらすことによって、アプリケーションがユーザに核となる目的や機能を伝える方法を再検討する貴重な機会をiOS 7は提供します。
貴方は現在この機会を最大限利用するための準備をしていないかもしれませんが、アプリケーションをiOS 7で実行するための更新を心に留めてください。
(アプリケーションの設計を再検討する準備ができていない、または新しいプロジェクトを始めていない場合は、新しい手引である『iOS 7用の設計』を読んでください。)



・アプリケーションを特徴付ける

アプリケーションを再設計するか現在の設計を更新するかを決定するには、アプリケーションの特性が行程にどのような影響を与えるかを知る必要があります。
まず、戦略を具体化するために以下の質問を使用します。

  • アプリケーションの設計にAuto Layoutを使用しましたか?

    アプリケーションがAuto Layoutを使用している場合、作業は簡単です。
    Xcode 5では、Auto Layoutはアプリケーションを新しいUI要素の基準へ適応させることができ、テキストサイズの動的変化に適切に対応します。
    Auto LayoutはiOS 6アプリケーションの変換、またはiOS 6とiOS 7の両方をサポートする必要がある場合に特に有用です。

    Auto Layoutを使用していない場合、特にアプリケーションが複数のバージョンをサポートする必要がある場合は、今は始めるのに最適な時期かもしれません。
    手動またはプログラムによるレイアウト技術を使用している場合、テキストサイズが変更された時にレイアウトを適切に調整することを保証する責任があります。

  • アプリケーションはiOS 6をサポートする必要がありますか?

    iOSユーザは非常に迅速にデバイスをアップデートし、お気に入りのアプリケーションがそれに追随することを期待する傾向があることを覚えておいてください。

    ビジネス上の理由からiOS 6をサポートする必要がある場合でも、現在のアプリケーションをiOS 7へのアップデートを始めるのは最適です。
    その後、アプリケーションのiOS 6バージョンへの設計変更を適用します。
    この行程のいくつかの詳細についてはiOS 6のサポートを参照してください。

変換戦略を具体化する次の行程は、アプリケーションをカスタマイズする方法を検討することです。
カスタマイズの主旨(と使用する特定のカスタマイズ技術)は、しなければならない作業の種類に影響を与えます。

アプリケーションのカスタマイズの考えは、以下の3種類に分類されます。

  • 標準
    アプリケーションは標準の物のみを含み、UIKitで提供されているUI要素はカスタマイズしません。

  • カスタム
    アプリケーションはUIKitのUI要素を含まない、完全にカスタムのUIで表されます。

  • ハイブリッド
    アプリケーションは標準とカスタムの要素が混在し、UIKitの淡彩や外観をカスタマイズしたAPIを使用してカスタマイズした標準要素を含みます。

標準アプリケーションでは、視覚とユーザ体験の設計がiOS 7環境で理にかなっているかどうかを判断する必要があります。
現在のレイアウトと相互作用モデルを維持すると判断した場合、作業のほとんどは小規模な調整と、アプリケーションが新しいシステム全体のジェスチャを正確に処理することを保証することが含まれます。

カスタムアプリケーション(つまりUIKitのUI要素を使用しないアプリケーション)は、より繊細なアプローチが必要となります。
例えば、現在のアプリケーションのUIや体験がまだ適切であると感じている場合、行うことは非常に少ないかもしれません。
逆に言えば、iOS 7ユーザを喜ばせるためにアプリケーションの性質やユーザ体験を変更する必要があると感じている場合は、より多くの作業を行うことになります。

ハイブリッドアプリケーションは、行ったカスタマイズと、カスタムと標準の要素の組み合わせ方法によって、必要となる作業量が変わります。
更にハイブリッドアプリケーションの全体的な設計を再検討し、カスタマイズが標準の要素と統合した時に、上手く機能して見栄えが良いことを確実にする必要があります。


完全なカスタムの方法で標準のiOS 6のUIを模倣しているアプリケーションは率直に言って時代遅れに見えるため、多くの作業が必要となるでしょう。



参考文献

Apple/ iOS 7 UI Transition Guide

0 CommentsPosted in 資料

NSBundleクラス

2013. 09. 09
・継承
NSObject

・準拠
NSObject (NSObject)

・フレームワーク
/System/Library/Frameworks/Foundation.framework

・利用可能
iOS 2.0以降で利用可能

・宣言
NSBundle.h

・手引書
Bundle Programming Guide
Resource Programming Guide



●概要

NSBundleオブジェクトは、グループのコードとプログラムで使用できるリソースの、ファイルシステム内での場所を表します。
NSBundleオブジェクトはプログラムリソースの場所を特定し、実行可能なコードを動的に読み込みと非読み込みを行い、ローカライズの支援を行います。
バンドルはアプリケーションやフレームワーク、プラグインといった、Xcodeで使用するプロジェクトのタイプのいずれかで構築します。

バンドルの構造は、ターゲットとするプラットフォームや構築するバンドルのタイプに依って異なりますが、NSBundleクラスはほとんどの場合(全てではない)基本的な構造は非表示にしています。
バンドルからのリソースの読み込みに使用するメソッドの多くは、自動的に適切な開始ディレクトリを見つけて、既知の場所にあるリソースを検索します。
(Mac OS XとiOS用の)アプリケーションバンドルの構造についての詳細は、『Bundle Programming Guide』を参照してください。
フレームワークバンドルの構造についての詳細は、『Framework Programming Guide』を参照してください。
Mac OS Xプラグインの構造についての詳細は、『Code Loading Programming Topics』を参照してください。

Macアプリケーションでのnibファイルや画像の読み込みについての追加情報は『NSBundle Additions Reference』を参照してください。
iOSアプリケーションでのnibファイルの読み込みについての詳細は、『NSBundle UIKit Additions Reference』を参照してください。

(NSStringとCFStringのように)Core Foundationの名前が対応する他のいくつかのFoundationクラスと異なり、NSBundleオブジェクトは(toll-free bridgedによる)CFBundleの参照をキャストすることはできません。
CFBundleで提供する機能が必要な場合は、CFBundle Reference APIを使用してCFBundleを作成することができます。
データ型の変換についての詳細は『toll-free bridging』を参照してください。



●タスク

●NSBundleの初期化

+ bundleWithURL:
+ bundleWithPath:
– initWithURL:
– initWithPath:

●NSBundleの取得

+ bundleForClass:
+ bundleWithIdentifier:
+ mainBundle
+ allBundles
+ allFrameworks

●バンドルされたクラスの取得

– classNamed:
– principalClass

●リソースの検索

– URLForResource:withExtension:subdirectory:
+ pathForResource:ofType:inDirectory:
– URLForResource:withExtension:
– pathForResource:ofType:
– URLsForResourcesWithExtension:subdirectory:
– pathForResource:ofType:inDirectory:
– URLForResource:withExtension:subdirectory:localization:
– pathForResource:ofType:inDirectory:forLocalization:
+ pathsForResourcesOfType:inDirectory:
– pathsForResourcesOfType:inDirectory:
– URLsForResourcesWithExtension:subdirectory:localization:
– pathsForResourcesOfType:inDirectory:forLocalization:
+ URLForResource:withExtension:subdirectory:inBundleWithURL:
+ URLsForResourcesWithExtension:subdirectory:inBundleWithURL:
– resourcePath

●バンドルディレクトリの取得

– bundleURL
– bundlePath

●バンドル情報の取得

– bundleIdentifier
– infoDictionary
– objectForInfoDictionaryKey:
– builtInPlugInsURL
– builtInPlugInsPath
– executableURL
– executablePath
– URLForAuxiliaryExecutable:
– pathForAuxiliaryExecutable:
– privateFrameworksURL
– privateFrameworksPath
– sharedFrameworksURL
– sharedFrameworksPath
– sharedSupportURL
– sharedSupportPath
– resourceURL

●ローカライズリソースの管理

– localizedStringForKey:value:table:

●バンドルのコードの読み込み

– executableArchitectures
– preflightAndReturnError:
– load
– loadAndReturnError:
– isLoaded
– unload

●ローカリゼーションの管理

+ preferredLocalizationsFromArray:
+ preferredLocalizationsFromArray:forPreferences:
– localizations
– developmentLocalization
– preferredLocalizations
– localizedInfoDictionary



●クラスメソッド

mainBundle

現在実行されているアプリケーションの場所のディレクトリに対応するNSBundleオブジェクトを返します。

+ (NSBundle *)mainBundle

戻り値
実行可能なアプリケーションがあるディレクトリに対応するNSBundleオブジェクト、またはバンドルオブジェクトが作成できなかった場合はnilになります。

解説
このメソッドは既存のバンドルオブジェクトが存在しない場合、生成して初期化を行います。
新しいオブジェクトは実行可能なアプリケーションがある場所のディレクトリに対応します。
有効なバンドルを持っていることを確実にするために、必ず戻り値を確認してください。
このメソッドはバンドルされていないアプリケーションでも、有効なバンドルオブジェクトを返す場合があります。

一般的に、メインバンドルはアプリケーションファイルパッケージまたはアプリケーションラッパーに対応しており、アプリケーション名と『.app』拡張子によって表されたディレクトリで提供されています。

利用可能
iOS 2.0以降で利用可能。

宣言
NSBundle.h



●インスタンスメソッド

bundleIdentifier

レシーバのバンドル識別子を返します。

- (NSString *)bundleIdentifier

戻り値
バンドルの情報プロパティリストでCFBundleIdentifierキーによって定義されている、レシーバのバンドル識別子です。

利用可能
iOS 2.0以降で利用可能。

宣言
NSBundle.h


localizedStringForKey:value:table:


指定されたテーブル内に存在する、指定されたキーによって指定された文字列のローカライズバージョンを返します。

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName

パラメータ
key
tableNameによって識別されたテーブル内の文字列のキーを指定します。
value
keyがnil、またはkeyのローカライズされた文字列がテーブル内で見つけられなかった場合に返す値を指定します。
tableName
検索するレシーバの文字列テーブルを指定します。
tableNameがnilまたは空文字列の場合、メソッドはLocalizable.strings内のテーブルの使用を試みます。

戻り値
テーブルtableName内のkeyによって指定された文字列のローカライズバージョンです。
valueがnilまたは空文字列で、ローカライズされた文字列がテーブル内に見つからない場合はkeyを返します。
keyvalueが両方ともnilの場合、空文字列を返します。

解説
文字列のローカライズと.stringファイルの仕様についての詳細は『String Resources』を参照してください。

ユーザのデフォルトのNSShowNonLocalizedStringsを使用して、メソッドがローカライズされた文字列を見つけられない場合にメッセージをログに残すように、localizedStringForKey:value:table:の動作を変更することができます。
この(グローバルドメイン内、またはアプリケーションのドメイン内の)デフォルトをYESに設定した場合、メソッドがテーブル内にローカライズされた文字列を見つけられなかった時は、コンソールにメッセージをログに残して返す前にkeyを大文字にします。

以下の例は、ボタンがクリックされた時にキーの静的配列を循環させ、Buttons.stringsという名前の文字列テーブルから各キーの値を取得して、返された値でボタンのタイトルを設定します。

- (void)changeTitle:(id)sender
{
    static int keyIndex = 0;
    NSBundle *thisBundle = [NSBundle bundleForClass:[self class]];

    NSString *locString = [thisBundle localizedStringForKey:assortedKeys[keyIndex++]
        value:@"No translation" table:@"Buttons"];
    [sender setTitle:locString];
    if (keyIndex == MAXSTRINGS) keyIndex=0;
}

利用可能
iOS 2.0以降で利用可能。

宣言
NSBundle.h


pathForResource:ofType:

指定した名前と拡張子から、識別されたリソースのフルパス名を返します。

- (NSString *)pathForResource:(NSString *)name ofType:(NSString *)extension

パラメータ
name
リソースファイル名を指定します。
nameが空文字列またはnilの場合、提供された型で最初に検出されたファイルを返します。
extension
extensionが空文字列またはnilの場合、拡張子が存在しないと仮定し、nameと正確に一致する最初に検出されたファイルとなります。

戻り値
リソースファイルのフルパス、またはファイルが見つからなかった場合はnilです。

解説
このメソッドは指定されたバンドルの非ローカライズリソースディレクトリ内で一致するリソースファイルを最初に検索します。
(OS Xではこのディレクトリは通常Resourcesと呼ばれますが、iOSの場合はメインバンドルディレクトリです。)
一致するリソースファイルが見つからない場合、任意の利用可能な言語固有の『.lproj』ディレクトリのトップレベル内を検索します。
(言語固有ディレクトリの検索順序はユーザの設定に対応します。)
これらの場所にある他のサブディレクトリを再帰することはありません。
詳細については『Internationalization Programming Topics』を参照してください。

以下のコードの断片はバンドル内のplistへのパスを取得し、NSDictionaryに読み込みます。

NSBundle *thisBundle = [NSBundle bundleForClass:[self class]];
if (commonDictionaryPath = [thisBundle pathForResource:@"CommonDictionary" ofType:@"plist"]) {
    theDictionary = [[NSDictionary alloc] initWithContentsOfFile:commonDictionaryPath];
}

利用可能
iOS 2.0以降で利用可能。

宣言
NSBundle.h


URLForResource:withExtension:

指定した名前とファイル拡張子によって識別されたリソースのファイルURLを返します。

- (NSURL *)URLForResource:(NSString *)name withExtension:(NSString *)extension

パラメータ
name
リソースファイルの名前を指定します。
extension
extensionが空文字列またはnilの場合、拡張子が存在しないと仮定し、nameと正確に一致する最初に検出されたファイルとなります。

戻り値
リソースファイルのファイルURL、またはファイルが見つからなかった場合はnilです。

解説
extensionが空文字列またはnilの場合、ファイル名と正確に一致する最初に検出されたパス名を返します。

このメソッドは指定されたバンドルの非ローカライズリソースディレクトリ内で一致するリソースファイルを最初に検索します。
(OS Xではこのディレクトリは通常Resourcesと呼ばれますが、iOSの場合はメインバンドルディレクトリです。)
一致するリソースファイルが見つからない場合、任意の利用可能な言語固有の『.lproj』ディレクトリのトップレベル内を検索します。
(言語固有ディレクトリの検索順序はユーザの設定に対応します。)
これらの場所にある他のサブディレクトリを再帰することはありません。
詳細については『Internationalization Programming Topics』を参照してください。

利用可能
iOS 4.0以降で利用可能。

宣言
NSBundle.h



●定数



●通知



参考文献

NSBundle Class Reference






QuietControl 30 wireless headphones
Calendar
08 | 2013/09 | 10
Sun Mon Tue Wed Thu Fri Sat
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 - - - - -
Recent Articles
iTunes


Swift
Categories
Tips
Profile

水月杏香

Author:水月杏香
永遠の初心者プログラマ。

Wish List
WACOM


ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
BOSE

QuietControl 30 wireless headphones
Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
Amazon


OpenGL ES
SQLite
Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Visitors
QR Code
QR