ios6でのモーダルビュー表示

モーダルビューの表示がiOS6から変わっていたのでメモ。

  iOS5以前

[self presentModalViewController: viewController animated:YES];

  iOS6

[self presentViewController:inputViewCtl animated:YES completion:^{
     NSLog(@"complete");  // 完了時の処理をここに書く
}];

モーダルビューが呼ばれたときに、裏にあるビューは一度削除されて。戻るときは、またViewWillAppearが再度呼ばれます。

UITextViewとUIToolbar

UITextViewを使うとUITextFieldと違って完了ボタンが改行ボタンになっている。完了ボタンに変更もできるけど、改行もしたいからUIToolbarを使用して、そこに完了ボタンを配置してみる。

-(void) init
{
    toolBar = [[[UIToolbar alloc] init]];
    // ツールバーを配置する場所
    [toolBar setFrame:CGRectMake(0, 220, rootViewController.view.bounds.size.width, 44)];
    [hogeViewController.view addSubview:toolBar];

     // スペーサの生成
     UIBarButtonItem *spacer = [[UIBarButtonItem alloc]
     initWithBarButtonSystemItem:
     UIBarButtonSystemItemFlexibleSpace
     target:nil action:nil];

     // 完了ボタンの生成
     UIBarButtonItem *doneButton =
    [[[UIBarButtonItem alloc]initWithTitle:@"Done"
                                                style:UIBarButtonItemStyleBordered
                                                target:self
                                                action:@selector(onDoneButton)]autorelease];

     // スペーサを入れて左端に完了ボタンを配置する
     [toolBar setItems:[NSArray arrayWithObjects:spacer, spacer, doneButton, nil]];
}

// 完了ボタンがおされたとき
-(void)onDoneButton
{
    // キーボードを隠すなどの完了時の処理
}

キーボートが日本語とかになっていると、予測変換?のバーが出てきてせっかく作ったツールバーが隠れてしまう。。
ツールバーをキーボードのサイズで動的に変更することで解決しました。
方法は、ここに書かれているTextfiledを動的に変更する方法をツールバーに適応させればOK!!

UITextViewだと自分でいろいろカスタマイズ出来るけど、優しさが必要だな。

UITextViewあれこれ

UITextViewの実装でいろいろ試してみたのでのでメモ

  キーボード表示

遷移時にbecomeFirstResponder/textViewShouldEndEditing を使用すればキーボード編集開始/終了でデリゲートが呼ばれるはずなのに呼ばれない。。。
いろいろ試してみたら、addSubviewした後にbecomeFirstResponderすることでキーボードが表示された。
こんな感じ。

CGRect rect = CGRectMake(0, 0, 250, 50);
UITextView* textView UITextViewalloc] initWithFrame:rect];
textView.delegate = self;

[hogeViewController.view addSubview:textView];
[textView becomeFirstResponder];                // キーボードを表示

続いてデリゲートメソッドはこんな感じ。戻り値をNOにすると呼ばれなくなるので注意。

- (BOOL) textViewShouldBeginEditing: (UITextView*) textView
{
    // 編集開始時の処理

    return YES;
}

-(BOOL)textViewShouldEndEditing:(UITextView *)text
{
     // 編集終了時の処理
 
    return YES;
}

 

  テキストエリアを枠線&角丸にする

デフォルトのテキストエリアだとかなり悲しい感じなので枠線を付けて角丸にしてみます。

// 枠線
textView.layer.borderWidth = 1;
textView.layer.borderColor = [[UIColorblackColor] CGColor];
// 角丸
textView.layer.cornerRadius = 5;

layerを使用するために、QuartzCore.h のimportを忘れずに。
UITextViewってなんか扱いにくいなぁ。

objective-Cでの型変換

あんまり用途がないかなって思っていたけど、使う機会が何回かあったのでいくつかメモしておきます。

  NSString* から char*への変換

NSString* str = "hoge";
char* ch = [str UTF8String];

  char* から NSString*への変換

char* ch = "hoge";
NSString* str = [NSString stringWithCString:ch encoding:NSUTF8StringEncoding];

  NSString から int への変換

int value = [ @"123" intValue ]; 

※floatやdoubleに関しても同様にできるよ。

  int から NSString* への変換

NSString* value_str; 
value_str = [ NSString stringWithFormat : @"%d", 123 ];

メモ(鍵とか証明書とか)

iOSでのPush通知(Provider側)を実装するのにいろいろ証明書やら鍵を作成するので
その時に調べた内容をメモしておきます。

まずは鍵と証明書の種類について
 .key : 秘密鍵(Private Key)
 .csr : 証明書発行要求(CSR : Certificate Signing Request)
 .crt : 証明書(CRT : Certificate)
 .crl : 証明書失効リスト(CRL : Certification Revocation List)

これらには、DER(Distinguished Encoding Rules)形式 と PEM(Privacy Enhanced Mail)形式がある。PEM形式は、DER形式(バイナリ)をBASE64で可視化したもの。
これを踏まえてProviderにインストールするSSL証明書と鍵を作成する。
apns-dev-cert.p12 : 証明書から作成したもの
apns-dev-key.p12 : 秘密鍵から作成したもの

① PKCS #12 ファイルapns-dev-cert.p12 から SSLサーバ証明書(EV SSL証明書)を取り出し、apns-dev-cert.pemに保存

$ openssl pkcs12 -clcerts -nokeys -out apns-dev-cert.pem -in apns-dev-cert.p12

② PKCS #12 ファイルapns-dev-key.p12 から秘密鍵を取り出し、暗号化せずにapns-dev-key.pem に保存

$ openssl pkcs12 -nocerts -out apns-dev-key.pem -in apns-dev-key.p12

③ Apache で ssl を使用する場合、起動時に秘密鍵のパスワードを聞いてくるので,途中でとまってしまいます。
server.key を復号化して、パスワードを入力しなくても秘密鍵を使用できるようする。

$ openssl rsa -in apns-dev-key.pem -out apns-dev-key-noenc.pem

④ apns-dev-cert.pem と apns-dev-key-noenc.pemを連結してapns-dev.pemに吐き出す

$ cat apns-dev-cert.pem apns-dev-key-noenc.pem > apns-dev.pem

apns-dev-key-noenc.pem, apns-dev.pem をサーバの適切な場所へ放りこんでおく。

Push通知は実装以上にこの辺が面倒だな。

iProcessingでiPhoneアプリ作成

面白そうなのがあったので試してみまた。iProcessing。
いままでこつこつやっていたProcessingの資産をiPhoneアプリに出来るか試してみました〜。

環境
macOSX 10.5 leopard
Xcode 3.1

① iProcessingをダウンロード
 以下のページからiProcessingをここからダウンロード
 iOS3とiOS4があるけど今回はiOS3を使用。

② サンプルを動かしてみる
 ダウンロードしたフォルダ「0004」配下の「examples」の中に様々なサンプルを起動すると、
 iPhoneシミュレータが起動して、アプリの実行結果をシミュレートできる。

③ いままでの資産を動かしてみる。
 サンプルを丸ごとコピーする。
 [プロジェクトのアイコン] →「Resorces」→「main」→「main.pde」
 「main.pde」ファイルを選択して、Processingのコードを丸っとコピー。
 あとは、ビルドすればシュミレーター上で動きます。
 
 このプロジェクトの作り方ってoFの007と同じだけど、なんだか慣れないなぁ。

ちなみにOSX 10.6 SnowLeopardだとアクティブSDKを「iPhoneシミュレータ3.2」にしてiPadでの起動の様子できるみたい。
詳細はここを参照してください。

ARC forbids explicit message send of ‘autorelease’

また出くわしたので備忘録として記載しておきます。

iOS5になってからARCを使用していない既存のライブラリをインポートしてコンパイルすると
以下のエラーが大量にでてくる。

ARC forbids explicit message send of ‘autorelease’
‘release’ is unavailable: not available in automatic reference counting mode

【原因】
iOS5からはARCがメモリ管理を適切に行ってくれるらしいのでreleaseやautoreleaseが必要なくなったみたい。
必要ないのに記述してるから、いらないよ!ってエラーらしい。

【対処法】
① Xcodeでプロジェクトファイルを選択
② 「Build setting」の「Apple LLVM Compiler 3.0 – Language」の中に
「Objecctive-C Automatic Refarence Counting」があるので、それを「YES」から「NO」に変更

「This game is not recognized by Game Center.」って・・・

Game Centerに対応しようとしたらアホみたいなところでハマったのでメモして。

sandboxアカウントをいったんログアウト後に、再度sandboxアカウントでログインしようとしたら以下のメッセージが・・・。
「This game is not recognized by Game Center.」
なぜに。ってことでいろいろ調べると次のチェック項目が。

・Bundle IDとBundle Identiferが一致しているか
・プロビジョニングファイルは正しいか
・iTunes ConnectでGame CenterをEnableにしているか
・サンドボックス用のアカウントを使用しているか

全部チェックしたが問題なし。。。
こんな時はXcodeを再起動して入れ直しだ!!ってことで再起動してアプリを入れ直したが解決せず。

泣きそうになりながらアプリを削除して、入れ直したらログインできました!!