1 2 3 4 5 6 7 8 9 | // 時間計測を開始する NSDate *startTime = [NSDate date]; // 時間計測する処理を行う // 経過時間を計測する NSTimeInterval elapsedTime = [startTime timeIntervalSinceNow]; NSString *elapsedTimeString = [NSString stringWithFormat:@"Elapsed time: %f 秒", -elapsedTime]; LOG(@"%@", elapsedTimeString); |
「cocoa, uikit」カテゴリーアーカイブ
Viewイメージをキャプチャーし、PNG画像で保存する
画面に表示されていないビューのキャプチャーを行う。
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 31 32 33 | // UIImage を PNG画像データへ変換する + (BOOL)saveUIImage2PNG:(UIImage *)image FileName:(NSString *)fileName { NSData *data = UIImagePNGRepresentation(image); NSString *pngFilePath = [NSString stringWithFormat:@"%@/%@.png", [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"], fileName]; NSLog(@"%@", pngFilePath); BOOL result; if ([data writeToFile:pngFilePath atomically:YES]) { result = YES; } else { result = NO; } return result; } // Viewイメージをキャプチャーする // 備考: 画面に表示していなくてもキャプチャーできる + (UIImage *)captureViewImage:(UIView *)view { UIImage *capture; UIGraphicsBeginImageContext(view.bounds.size); [view.layer renderInContext:UIGraphicsGetCurrentContext()]; capture = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return capture; } |
コードが思うように動かない場合にチェックする点
– ボタンの下にビューがないとイベントがハンドリングできない
ボタンを動的に配置していて、ある場合にイベントがハンドリングできない場合は、ボタンの下にビューがあるかチェックすること。
CoreData マイグレーション
CoreData のマイグレーションの手順は、以下の通り。
1. モデルバージョンを追加し、モデルを変更する
2. Mapping Model を追加する
3. マイグレーションコードを追加する
– (NSPersistentStoreCoordinator *)persistentStoreCoordinator メソッドにマイグレーションの指定を行う処理を追加する
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /** Returns the persistent store coordinator for the application. If the coordinator doesn't already exist, it is created and the application's store added to it. */ - (NSPersistentStoreCoordinator *)persistentStoreCoordinator { if (__persistentStoreCoordinator != nil) { return __persistentStoreCoordinator; } NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataSample.sqlite"]; // マイグレーションの指定 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; NSError *error = nil; __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error]) { |
iPad ライブラリ
– iPad で、縦横画面で2ペインを実現できる (UISplitViewController 代替)
UISplitViewController を適用しただけでは、デバイスが縦向きの場合はポップオーバーされ、横向きの場合のみ2ペイン構成とされる。
MGSplitViewController は、デバイスの向きが縦横の場合も容易に2ペインが実現でき、root と detail の入れ替え、分割方向も垂直平行と切り換えられる。
Matt Legend Gemmell
MGSplitViewController for iPad
iPhone からサーバへhttp通信でファイルアップロードする方法
サーバ側 PHPプログラム
※ 本PHPプログラムは、ファイル名: file_upload.php とする。
※ 本PHPプログラムのディレクトリ配下に”files”ディレクトリを作成しておく。
アップロードされるファイルは、filesディレクトリ配下に作成される。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $target_path = "files/"; $target_path = $target_path . basename( $_FILES['uploadedfile']['name']); if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) { echo "The file ". basename( $_FILES['uploadedfile']['name']). " has been uploaded"; } else{ echo "There was an error uploading the file, please try again!"; } ?> |
クライアント側プログラム
※ ASIHTTPRequest (http://allseeing-i.com/ASIHTTPRequest/)からライブラリ取得する。
iOS用サンプル プログラムの以下の箇所を変更し動作させる。
※ pathForResource メソッドでパスが取得できない場合、プロジェクトの登録情報が不正な場合がある。
問題のリソースファイルを再度、プロジェクトに登録し直せば解決する場合が多い。
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 31 | @implementation UploadViewController - (IBAction)performLargeUpload:(id)sender { // 以下、ファイルアップロード検証用コード [request cancel]; // 上記のphpプログラムURL NSURL *url = [NSURL URLWithString:@"http://xxxxxx/file_upload.php"]; [self setRequest:[ASIFormDataRequest requestWithURL:url]]; #if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_4_0 [request setShouldContinueWhenAppEntersBackground:YES]; #endif NSBundle *bundle = [NSBundle mainBundle]; // アップロードテストするファイル NSString *pathUploadFile = [bundle pathForResource:@"info" ofType:@"png"]; NSLog(@"%@", pathUploadFile); [request setFile:pathUploadFile forKey:@"uploadedfile"]; [request setUploadProgressDelegate:progressIndicator]; [request setDelegate:self]; [request setDidFinishSelector:@selector(uploadFinished:)]; [request setDidFailSelector:@selector(uploadFailed:)]; [request startAsynchronous]; [resultView setText:@"Uploading data..."]; // ↑ファイル アップロード検証用コード |
shareKitを利用するための手順
iPhone アプリから twitter 連携を行い、メッセージ投稿・画像投稿を実装する場合、shareKit が良いかなと思います。
(メッセージ投稿を実装できるライブラリは他にもありますが、画像投稿ができなかったりするようです。)
以下、利用するための手順です。
twitter APIを取得(画像投稿も行う場合、bitly APIも取得)
shareKit の SHKConfig.h にAPI登録で取得した情報を設定する
twitter api 登録は以下のURLから行う
twitter api登録
api 登録を行い、以下の情報を入手する
– API Key
– Consumer Key
– Consumer secret
bitly 登録は以下のURLから行う
bitly登録
api 登録を行い、以下の情報を入手する
ー API Key
上記の情報を SHKConfig.h に設定する
twitter API 登録時の注意点
アプリケーションの種類は、「ブラウザアプリケーション」を選択すること
コールバックは、「shareKitのヘッダに登録するURLと同じ」にすること
標準のアクセスタイプは、「Read & Write」を選択すること
xAuth 認証を行う場合、別途申請が必要となる
(SHKConfig.h のコメントとして注意点が記載されています)
実装の注意点
shareKit ライブラリは、通信中に画面の連続タップなどをブロックする処理がありません。
不要なイベントをブロックする処理を追加する必要があります。
shareKit ライブラリは画面の回転に対応していますが、回転に対応する必要がないアプリの場合、回転をしない様にコードを変更する必要があります。(当然ですね。。。(・_・)(._.))
twitter ログイン処理に関してもキャンセル後、通信を中断する処理がありません。
通信を中断する処理を追加する必要があります。
NSOperationQueue の処理が実行できない場合
非同期通信を行う場合、NSOperation, NSOperationQueue を利用するかと思いますが、なぜか動かない…と調査したところ、iOS 4より NSOperationQueue の仕様が変更されているとのこと。
以下の様にすることで iOS 4 でも動作しました。
しかしながら、iOS 4 で動作するコードは、iPad 3.2 Simulator では問題があるようなので、respondsToSelector で判断し、処理を変更する必要があるみたいです。
1 2 3 | // iOS4 からメッソドが変更され、メインスレッドに明示的に関連づける必要がある // _queue = [[NSOperationQueue alloc] init]; _queue = [NSOperationQueue mainQueue]; |
ユニークな識別子を作成する
1 2 3 4 5 | // ユニークな識別子を作成する CFUUIDRef uuid; uuid = CFUUIDCreate(NULL); _identifier = (NSString*)CFUUIDCreateString(NULL, uuid); CFRelease(uuid); |