X-BASIC for iOSの開発を終了、さらに既存アプリも全てiOS6&縦568(*2)対応させることで、その必要変更点がわかったので、ここに要約しておく。
ポイントだけ列記するので、詳細はドキュメント参照のこと。
(0)前に書いた画面回転処理の変更
(1)
[self presentModalViewController:viewCtrl animated:YES];
→
[self presentViewController:viewCtrl animated:YES completion:NULL];
実はiOS5から変更になっていたらしいが、iOS5では上の記述でも動いた。
でも6では動かない。
(2)
[self dismissModalViewControllerAnimated:NO];
→
[self dismissViewControllerAnimated:YES completion:NULL];
上の記述でもiOS6で動くが、推奨されない(審査は通る)。
iOS5にも対応するときは、バージョンを調べて 双方を切り替える必要がある。
(3)UIWebViewを使って動画再生させた後の挙動が違う
1つ前に指定した動画まで再生されてしまう。
バグだと思う。
MPMoviePlayerControllerに置き換える必要がある。
(4)View*Load/Appearの発生タイミングが違う
なんか並行動作が開始されるタイミングが変わったみたい。
このタイミングに強く依存していると誤動作する。
(5)iTunesArtworkがLarge Icon(だったと思う)という名前になって、1024*1024でしか受け付けなくなった。
512*512のものは受け付けてくれないので、作り直しが必要。
(6)iPod5/iPhone5の縦長画面(568*2)の画面で「起動」したい時は、Default-568@2x.pngという起動画面を用意する必要がある。
(一応Xcode4上で自動作成させる方法はあるけど。)
これがないと、縦長画面機でもその中央部分だけ使って従来機と同じ画面縦幅で起動する。
568画面への対応は基本的には、UIViewのAutosizingで縦を有効にしておくだけで、自動再配置してくれる。
ちなみに、568画面で異なるUIViewController で表示させることも可能だが、iPodとiPadの切り替えはplistへの追記だけでいけるのに対し、こちらはiOS泥臭くプログラムを書くしかない、と思う。やりかたは画面幅を認識した後modalViewで表示するだけ。
拙作では「プログラマーず電卓 V2.00」で画面を変化させている。
追記。ImagePickerによるカメラ撮影時の画面は、iPod5/iPhone5でも画像部分のサイズは変わっていない。シャッターボタン周りの幅が広がっただけである(撮像素子にそんな縦長の物はないからである)。
(7)iPadでは起動画面に〜@2x.のものを用意したほうが良い。ただし、こちらは
従来解像度のファイルのファイル名だけそれに変えたら通る。
(これもXcode4上で自動作成させる方法がある。)
以上。
結構細かく多いで手間はかかる。
私は、ビットマップで作っていたiTunesArtworkの大元データを、この際ベクトルデータのものに作りなおした。画像の用意をするのが一番面倒かも。
2012年11月30日金曜日
2012年1月26日木曜日
タッチイベントの発生仕方
UIView上、正確にはUIResponderでは、画面をタッチするとtouchesBegan/Moved/Ended/Cancelledイベントが発生する=メソッドが呼び出されるが、どういう状態のときにどう送られてくるかは資料がなかった。
とりあえず解ったのは以下の通り。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
(1)基本はBegan(押したとき)->Moved(移動中)->Ended(指を離した)の順で呼び出される
ただし、移動が少ないときは Movedは来ない場合もある。
また、複数タッチしたときは、その都度Beganが発生する。
(2)同点タッチではタッチイベントは発生し続けない
逆に言えば、イベントは座標もしくは押下状態が変化したときのみ発生する。
タッチ中かどうかは上記イベントの発生状況によって判定するしかない。
(3)タッチが何本指なのかは[touches count]で取得出来る
iOS5ではGestureRecogniserでシングル/マルチ他の判定を行ってくれるようだが、iOS4までは処理内でこれを数えて処理を分けるしかない。
(4)マルチタッチは[touches count]==2だけで処理するとたぶん半分は抜けてしまう
実は人間の指の動作はそんなに厳密ではないので、Began*2という押され方をすることもある。それもマルチタッチと見なす方が「親切」だと思う。
私の作ったアプリはそうしている。
began(cnt=1)->moved(cnt=1)->began(cnt=1)->moved(cnt=2)なんてパターンもあるので注意。
(5)マルチタッチの場合、touchesで返ってくる座標情報の順番は不定
押下順ではない。従って、スライドの移動方向を得ようとするときには、全ての座標を読み取って、正しい組み合わせで算出する必要がある。
(6)ストロークしたまま画面外に出る・中に入るときのbegin/endedの状態
シミュレーター上
外に出る マウスクリックを離した時点でEnded(画面外座標を返している)
中に入る 全て無視される(中に入っても検出されない)
実機上
外に出る 物理画面内なら、タッチを離した時点でEnded(画面外座標を返している)
中に入る 全て無視される(中に入っても検出されない)
iOS5では、スータスバーの位置から下ドラッグすると、Nortify画面が出てくる
まあ、他にもいろいろあるが、プログラムを組む上で最低限必要なのはこれくらいかと。
マルチタッチ時の座標の処理は結構面倒で、頭の体操になる。
「長押しはどう処理すんねん」とかあるかもしれないけど、それはいずれまた。
とりあえず解ったのは以下の通り。
-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
(1)基本はBegan(押したとき)->Moved(移動中)->Ended(指を離した)の順で呼び出される
ただし、移動が少ないときは Movedは来ない場合もある。
また、複数タッチしたときは、その都度Beganが発生する。
(2)同点タッチではタッチイベントは発生し続けない
逆に言えば、イベントは座標もしくは押下状態が変化したときのみ発生する。
タッチ中かどうかは上記イベントの発生状況によって判定するしかない。
(3)タッチが何本指なのかは[touches count]で取得出来る
iOS5ではGestureRecogniserでシングル/マルチ他の判定を行ってくれるようだが、iOS4までは処理内でこれを数えて処理を分けるしかない。
(4)マルチタッチは[touches count]==2だけで処理するとたぶん半分は抜けてしまう
実は人間の指の動作はそんなに厳密ではないので、Began*2という押され方をすることもある。それもマルチタッチと見なす方が「親切」だと思う。
私の作ったアプリはそうしている。
began(cnt=1)->moved(cnt=1)->began(cnt=1)->moved(cnt=2)なんてパターンもあるので注意。
(5)マルチタッチの場合、touchesで返ってくる座標情報の順番は不定
押下順ではない。従って、スライドの移動方向を得ようとするときには、全ての座標を読み取って、正しい組み合わせで算出する必要がある。
(6)ストロークしたまま画面外に出る・中に入るときのbegin/endedの状態
シミュレーター上
外に出る マウスクリックを離した時点でEnded(画面外座標を返している)
中に入る 全て無視される(中に入っても検出されない)
実機上
外に出る 物理画面内なら、タッチを離した時点でEnded(画面外座標を返している)
中に入る 全て無視される(中に入っても検出されない)
iOS5では、スータスバーの位置から下ドラッグすると、Nortify画面が出てくる
まあ、他にもいろいろあるが、プログラムを組む上で最低限必要なのはこれくらいかと。
マルチタッチ時の座標の処理は結構面倒で、頭の体操になる。
「長押しはどう処理すんねん」とかあるかもしれないけど、それはいずれまた。
登録:
投稿 (Atom)