QA1709 何故iOS 4でアプリケーションを起動すると画面が黒くなる?

2011. 11. 30
質問:何故iOS 4でアプリケーションを起動すると画面が黒くなる?

回答:

起動時にメインウィンドウを可視にする設定は常に必須条件となっていますが、iOSの早期バージョンでは厳密に実施していませんでした。

iOS 4では、アプリケーションを起動する時の結果としてメインウィンドウを可視にする設定を行っていないと、画面が黒くなり、メインウィンドウはファーストレスポンダになりません。

アプリケーションが黒い画面で起動される場合は、以下の方法のいずれかが実装されているかを確認してください。


●Xcodeにおいて

アプリケーションデリゲートのapplicationDidFinishLaunching:またはapplication:didFinishLaunchingWithOptions:メソッドで、[window makeKeyAndVisible]が呼び出されているかを確認してください。

これは起動時にメインウィンドウを可視にし、ファーストレスポンダになるように設定します。


●Interface Builderにおいて

applicationDidFinishLaunching:application:didFinishLaunchingWithOptions:を使用しない、あるいはInterface Builderでウィンドウの可視化とファーストレスポンダの設定を行うには、
  1. Interface BuilderでMainWindow.xibを開く。

  2. DocumentウィンドウでWindowオブジェクトを選択する(図1参照)。

  3. InspectorウィンドウのAttributesタブで、『Visible at Launch』チェックボックスにチェックを入れる(図2参照)。

  4. MainWindow.xibを保存する。
Interface Builderでメインウィンドウを『Visible at Launch』に設定することは、XcodeのウィンドウでmakeKeyAndVisibleを呼び出すことと同じです。

両方を設定する必要はありません。

必要に応じてどちらかを選択してください。

図1:DocumentウィンドウでWindowオブジェクトを選択した場合

qa1709_window

図2:Inspectorウィンドウで『Visible at Launch』をチェックした場合

qa1709_inspector2



参考文献

Technical Q&A QA1709: Technical Q&A QA1709

0 CommentsPosted in 資料

NSRunLoopクラス

2011. 11. 20
●概要

NSRunLoopクラスは入力ソースを管理するオブジェクトへのプログラムインターフェイスを宣言します。

NSRunLoopオブジェクトは、NSPortオブジェクトやNSConnectionオブジェクト、ウィンドウシステムからのマウスやキーボードのイベントなどの、ソースの入力を処理します。

NSRunLoopオブジェクトはまた、NSTimerイベントも処理します。

アプリケーションは、NSRunLoopオブジェクトの生成も明示的な管理もすることはできません。

アプリケーションのメインスレッドを含め、各NSThreadオブジェクトは必要に応じてNSRunLoopオブジェクトを自動的に生成します。

現在のスレッドの実行ループにアクセスする必要がある場合は、クラスメソッドのcurrentRunLoopを実行してください。

NSRunLoopの視点から見ると、NSTimerオブジェクトは『入力』ではなく特殊なタイプで、それが意味することの一つに、発動した時に実行ループに返されないことに注意してください。

警告:NSRunLoopクラスは一般的にスレッドセーフとはみなされず、そのメソッドは現在のスレッドのコンテキスト内でのみ呼び出す必要があります。
異なるスレッド内で実行されているNSRunLoopオブジェクトのメソッドを呼び出そうとすると、予期しない結果を招くので決してしないでください。



●タスク

●実行ループとモードへのアクセス


+ currentRunLoop
– currentMode
– limitDateForMode:
+ mainRunLoop
– getCFRunLoop

●タイマーの管理


– addTimer:forMode:

●ポートの管理


– addPort:forMode:
– removePort:forMode:

●ループの実行


– run
– runMode:beforeDate:
– runUntilDate:
– acceptInputForMode:beforeDate:

●メッセージのスケジューリングとキャンセリング


– performSelector:target:argument:order:modes:
– cancelPerformSelector:target:argument:
– cancelPerformSelectorsWithTarget:



●クラスメソッド

currentRunLoop

+ (NSRunLoop *)currentRunLoop

現在のスレッドのNSRunLoopオブジェクトを返します。

実行ループにまだスレッドが存在しない場合、生成されて返されます。



●インスタンスメソッド



●定数

実行ループモード

NSRunLoopは以下の実行ループモードを定義します。

extern NSString* const NSDefaultRunLoopMode;
extern NSString* const NSRunLoopCommonModes;

NSDefaultRunLoopMode
NSConnectionオブジェクト以外の入力ソースを処理するモードです。
これは最も一般的に使用される実行ループモードです。

NSRunLoopCommonModes
オブジェクトは、『一般的な』モードのセットのメンバーとして宣言されている全ての実行ループモードによって監視されているものとして、この値を使用して実行ループに追加します。
詳細についてはCFRunLoopAddCommonModeを参照してください。

NSConnectionとNSApplicationによって以下の実行ループモードが追加で定義されています。

NSConnectionReplyMode 
NSModalPanelRunLoopMode 
NSEventTrackingRunLoopMode 



参考文献

NSRunLoop Class Reference

CADisplayLinkクラス

2011. 11. 16
●概要

CADisplayLinkオブジェクトは、アプリケーションがディスプレイのリフレッシュレートに描画を同期させるタイマーオブジェクトです。

アプリケーションは新しいディスプレイリンクを生成し、画面が更新された時に呼び出されるセレクタとターゲットオブジェクトを提供します。

次に、アプリケーションは実行ループへディスプレイリンクを追加します。

一度ディスプレイリンクが実行ループに関連付けされると、ターゲット上のセレクタは画面のコンテンツを更新する必要がある時に呼び出されます。

ターゲットは、以前のフレームが表示された時刻を取得するために、ディスプレイリンクのtimestampプロパティ読み取ることができます。

例えば動画を表示するアプリケーションで、次に表示するビデオフレームの計算にtimestampを使用する場合があります。

独自のアニメーションを実行するアプリケーションは、今後のフレームのどこで、どのようにオブジェクトを表示するかの決定にtimestampを使用する場合があります。

durationプロパティはフレーム間の時間の合計を提供します。

この値は次のフレームを表示するおおよその時間や、次のフレームを表示する準備の時間に描画動作を調整するなど、ディスプレイのフレームレートを計算するアプリケーションで使用することができます。

アプリケーションはpausedプロパティをYESに設定することによって通知を無効にすることができます。

また、アプリケーションが提供された時間内にフレームを提供できなかった場合、遅いフレームレートを選択することもできます。

遅くても一定のフレームレートを表示するアプリケーションは、フレームをスキップするアプリケーションよりも、ユーザに対してスムーズに表示されます。

frameIntervalプロパティを変更することによって、(見かけ上のフレームレートを減少させ)フレーム間の時間を増大させることができます。

アプリケーションがディスプレイリンクを終了させる時には、全ての実行ループから削除しターゲットからの関連付けを解除するためにinvalidateを呼び出す必要があります。

CADisplayLinkはサブクラス化してはいけません。



●タスク

●インスタンスの生成


+ displayLinkWithTarget:selector:

●通知を送信するためのディスプレイリンクのスケジューリング


– addToRunLoop:forMode:
– removeFromRunLoop:forMode:
– invalidate

●ディスプレイリンクの構成


  duration  property
  frameInterval    property
  paused    property
  timestamp    property



●プロパティ

Objective-Cのプロパティについての詳細は『The Objective-C Programming Language』の『Properties』を参照してください。

duration

@property(readonly, nonatomic) CFTimeInterval duration

画面を更新する間隔時間です。(読み込みのみ)

ターゲットのセレクタが1回以上呼び出される以前は、期間の値は未定義です。

アプリケーションはdurationにframeIntervalを乗ずることによって、各フレームをレンダリングする合計時間を計算することができます。


frameInterval

@property(nonatomic) NSInteger frameInterval

ディスプレイリンクがターゲットを再度通知する前に経過する必要があるフレーム数です。

デフォルト値は1で、ディスプレイのリフレッシュレートで通知されるアプリケーション内の結果になります。

値が1より大きい値に設定されている場合、ディスプレイリンクはネイティブのリフレッシュレートの極僅かな時間でアプリケーションに通知します。

例えば間隔を2と設定すると、ディスプレイリンクが他の全てのフレームを発生させるのに、半分のフレームレートを提供します。

値が1より小さい値にに設定されている場合の動作は未定義で、プログラマのエラーになります。


paused

@property(getter=isPaused, nonatomic) BOOL paused

ディスプレイリンクのターゲットへの通知が中断されているかを示すブール値です。

デフォルト値はNOです。

YESの場合、ディスプレイリンクはターゲットへ通知を送信しません。


timestamp

@property(readonly, nonatomic) CFTimeInterval timestamp

表示された最後のフレームに関連付けられている時間の値です。(読み込みのみ)

ターゲットは、次のフレームに何を表示すべきかを計算するために、このプロパティの値を使用する必要があります。



●クラスメソッド

displayLinkWithTarget:selector:

+ (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel

新しいディスプレイリンクを返します。

戻り値は新たに構築されたディスプレイリンクになります。

ターゲット上で呼び出されるセレクタは、以下のシグネチャを持つメソッドにする必要があります。

- (void) selector:(CADisplayLink *)sender;

センダーは、このメソッドによって返されるディスプレイリンクです。

新たに構築されたディスプレイリンクはターゲットを保持します。

target:画面が更新された時にオブジェクトに通知するターゲットを指定します。

sel:ターゲット上で呼び出すメソッドを指定します。



●インスタンスメソッド

addToRunLoop:forMode:

- (void)addToRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode

実行ループにディスプレイリンクを登録します。

複数の入力モードのディスプレイリンクに関連付けることができます。

実行ループが指定したモードで実行している間、ディスプレイリンクは新しいフレームが要求された時にターゲットを通知します。

実行ループはディスプレイリンクを保持します。

全ての実行ループからディスプレイリンクを削除するには、ディスプレイリンクにinvalidateメッセージを送信します。

runloop:ディスプレイリンクに関連付ける実行ループを指定します。

mode:実行ループに追加するディスプレイリンクのモードを指定します。
カスタムモードを指定するか、『NSRunLoopクラス』に記載されているモードの一つを使用することができます。


invalidate

- (void)invalidate

全ての実行ループのモードからディスプレイリンクを削除します。

全ての実行ループのモードからディスプレイリンクを削除すると、実行ループによって解放されます。

ディスプレイリンクもまたターゲットを解放します。


removeFromRunLoop:forMode:

- (void)removeFromRunLoop:(NSRunLoop *)runloop forMode:(NSString *)mode

指定したモードの実行ループからディスプレイリンクを削除します。

実行モードに関連付けられたディスプレイリンクが既に無い場合は、実行ループディスプレイリンクを解放します。

runloop:ディスプレイリンクに関連付けられた実行ループを指定します。

mode:ディスプレイリンクが実行されている実行ループのモードを指定します。



参考文献

CADisplayLink Class Reference

UIEventクラス

2011. 11. 15
●概要

UIEventオブジェクト(または単にイベントオブジェクト)はiOSのイベントを表します。

タッチイベント、モーションイベント、リモートコントロールイベントの3つの汎用タイプがあります。

リモートコントロールイベントは、ビデオの再生や次のオーディオトラックへのスキップなど、オーディオとビデオを管理することを可能にするために、外部アクセサリまたはヘッドセットからコマンドを受け取るレスポンダオブジェクトを許可します。

モーションイベントはiOS 3.0で、リモートコントロールイベントはiOS 4.0で導入されています。

イベントオブジェクトのタッチのタイプには、イベントに何らかの関係を持つ一つ以上のタッチ(つまり画面上での指のジェスチャ)が含まれています。

タッチはUITouchオブジェクトによって表されます。

タッチイベントが発生すると、システムは適切なレスポンダに送信し、touchesBegan:withEvent:などのUIResponderメソッドを呼び出すメッセージでUIEventオブジェクトに渡します。

レスポンダはイベントのため、またはイベントの特定のフェーズのためのタッチを評価し、適切に処理することができます。

UIEventのメソッドは、イベントの全てのタッチ(allTouches)や、特定のビューまたはウィンドウのみのタッチ(touchesForView:またはtouchesForWindow:)の取得をすることができます。

また、発生時間のオブジェクト(timestamp)を照会することによって、他のイベントを表すオブジェクトからイベントオブジェクトを識別することができます。

タッチイベントを表すUIEventオブジェクトはマルチタッチのシークエンスの間持続します。

UIKItは 全てのイベントに対して同じUIEventインスタンスを再利用します。

イベントオブジェクトまたはイベントオブジェクトから返されるオブジェクトを保持してはいけません。

あるフェーズから別のフェーズへ移行するイベントからの情報を保持する必要がある場合は、UITouchまたはUIEventオブジェクトからの情報をコピーする必要があります。

typesubtypeプロパティから、イベントのタイプとサブタイプを取得することができます。

UIEventはタッチ、モーション、リモートコントロールイベントのイベントタイプを定義しています。

また『シェイク』イベント用のモーションのサブタイプや、『再生』や『前曲へ』などリモートコントロールイベント用のサブタイプ定数の一連を定義します。

レスポンダチェーンのファーストレスポンダまたはレスポンダが、シェイクモーションイベントの処理に(motionBegan:withEvent:などの)UIResponderのモーション関連メソッドを実行します。

リモートコントロールイベントを処理するには、レスポンダオブジェクトがUIResponderのremoteControlReceivedWithEvent:メソッドを実装する必要があります。

iOS 3.2導入されたtouchesForGestureRecognizer:メソッドは、現在処理しているタッチについてのgesture-recognizerオブジェクト(UIGestureRecognizerのサブクラスのインスタンス)を照会することができます。



●タスク

●イベント用のタッチを取得

– allTouches
– touchesForView:
– touchesForWindow:

●イベント属性の取得

timestamp    property

●イベントタイプの取得

type    property
subtype    property

●Gesture Recognizer用のタッチの取得

– touchesForGestureRecognizer:



●プロパティ



●インスタンスメソッド

touchesForView:

- (NSSet *)touchesForView:(UIView *)view

レシーバによって表されるイベント用に、特定のビューに属するタッチオブジェクトを返します。

戻り値は、レシーバによって表されるイベントに関連する、特定のビューへのタッチを表すUITouchオブジェクトのセットです。

view:イベントに関連するタッチが行われるUIViewオブジェクトを指定します。



●定数



参考文献

UIEvent Class Reference

CGBitmapContext

2011. 11. 06
●概要

CGBitmapContext.hヘッダファイルは、Quartzのビットマップグラフィックスコンテキストの生成と操作を行う関数を定義します。

ビットマップグラフィックスコンテキストは、メモリにビットを描画するために使用することができる、CGContextRefの型です。

このリファレンス内の関数は、関数CGBitmapContextCreateを使用して生成された、Quartzのビットマップグラフィックスコンテキスト上でのみ動作します。

ビットマップグラフィックスコンテキスト内の各ピクセルの成分数は、(RGB、グレースケール、CMYKや目的とするカラープロファイルを指定した、CGColorSpaceRefによって定義される)色空間によって指定されます。

ビットマップグラフィックスコンテキストには、どのようにビットマップを生成するかと、ビットマップにアルファチャンネルが含まれているかどうかを指定します。



●タスク別の関数

●ビットマップコンテキストの生成

CGBitmapContextCreate
CGBitmapContextCreateWithData
CGBitmapContextCreateImage

●ビットマップコンテキストについての情報の取得


これらの関数は、ビットマップコンテキストが生成された時に指定した属性値を返します。

CGBitmapContextGetBitmapInfo
CGBitmapContextGetAlphaInfo
CGBitmapContextGetBitsPerComponent
CGBitmapContextGetBitsPerPixel
CGBitmapContextGetBytesPerRow
CGBitmapContextGetColorSpace
CGBitmapContextGetData
CGBitmapContextGetHeight
CGBitmapContextGetWidth



●関数

CGBitmapContextCreate

CGContextRef CGBitmapContextCreate (
    void *data,
    size_t width,
    size_t height,
    size_t bitsPerComponent,
    size_t bytesPerRow,
    CGColorSpaceRef colorspace,
    CGBitmapInfo bitmapInfo
);

ビットマップグラフィックスコンテキストを生成します。

戻り値は新しいビットマップコンテキスト、あるいはコンテキストが生成できなかった場合はNULLを返します。

このオブジェクトはCGContextReleaseを使用して解放する責任があります。

この関数を呼び出すと、Quartzは指定したビットマップを描画する環境(つまりビットマップコンテキスト)を生成します。

このコンテキストに描画する場合、Quartzはメモリの指定されたブロック内にビットマップデータとして図形をレンダリングします。

新しいビットマップコンテキストのピクセルフォーマットは、成分毎のビット数、色空間、そして(Image Bitmap Informationの定数として表される)アルファオプションの3つのパラメータによって決定されます。

アルファ値は、描画される時にピクセルの不透明度を決定します。

data:図形がレンダリングされるメモリ内の転送先のポインタを指定します。
このメモリブロックのサイズは、少なくとも(bytesPerRow * height)バイトである必要があります。
iOS 4.0以降とMac OS X v10.6以降では、Quartzでビットマップのメモリを割り当てる場合、NULLを渡すことができます。
これはメモリリークの問題を減少させ、自身でメモリ管理をする必要が無くなります。

width:必要なビットマップのピクセル幅を指定します。

height:必要なビットマップのピクセル高さを指定します。

bitsPerComponent:メモリ内のピクセルの各成分に使用するビット数を指定します。
例えば、32ビットピクセルフォーマットでRGB色空間の場合、1成分あたり8ビットの値を指定することになります。
サポートされているピクセルフォーマットのリストについては、『Quartz 2D Programming Guide』の『Graphics Contexts』を参照してください。

bytesPerRow:ビットマップの行毎に使用するメモリのバイト数を指定します。

colorspace:ビットマップコンテキストで使用する色空間を指定します。
インデックス色空間はビットマップグラフィックスコンテキストでサポートされていないことに注意してください。

bitmapInfo:ビットマップがアルファチャンネルを含む場合、ピクセル内におけるアルファチャンネルの相対的な位置と、ピクセル成分が浮動小数点または整数値かどうかの情報を定数で指定します。
アルファチャンネル情報を指定する定数はCGImageAlphaInfo型で宣言されていますが、このパラメータに安全に渡すことができます。
また、CGBitmapInfo型に関連付けられている他の定数を渡すこともできます。
(CGBitmapInfoとCGImageAlphaInfo定数についての詳細はCGImageリファレンスを参照してください)
ピクセルあたりのビット数、ピクセル成分あたりのビット数、CGBitmapContextCreate関数で使用するビットマップ情報など、色空間を指定する方法についての例は、『Quartz 2D Programming Guide』の『Graphics Contexts』を参照してください。



●データ型



参考文献

CGBitmapContext Reference






bose_soundlink_revolve
Calendar
10 | 2011/11 | 12
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

bose_soundlink_revolve
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