2012年11月30日金曜日

iOS6/568画面対応での要変更点

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の大元データを、この際ベクトルデータのものに作りなおした。画像の用意をするのが一番面倒かも。

CGContextSetLineWidth()とCGContextSetLineDash()の関係

X-BASIC for iOS開発の過程で、CGContextSetLineWidth()とCGContextSetLineDash()の関係がどうにもわからないので調べてみた。線幅を1より大きくした時のDashの描かれ方が意図したとおりにならない。

dash=10,20の設定でlineWidth1〜10まで変化させた時、下図のようになった。


width=1の時は設定通りだが、widthが増えるとそうではなくなる。
widthは縦幅だけでなくON部分のみ横幅まで増やしてしまう。
およそではあるが、widthに+1付きon区間が2増え、OFF区間が2減る。

最初iOSのバグかと思ったほど。
意図してこの2つを使いこなせる人間はいるのだろうか?

インターネットで色々調べてもLineWidth=1の時の描き方の例はあってもそれ以上の時は見つけられなかったので、ここに。

ちなみに、X-BASIC for iOSでは意図したとおりに描かれるようパラメーターを自動調整している。