2012年12月21日金曜日

iOSの色々なバグや仕様

X−BASIC for iOSの開発中に発見したiOSのバグや隠れ仕様をあげておく。

発生するバージョンを特定できてないものもあるが、今後の開発時に注意すれば良いということで。

・横画面において、キーボードwidthとheightが逆になってる
  (というか、縦画面時のサイズのまま返ってきている)
 0,0,1024,352のはずが、0,0,352,1024になってる。
 画面方向を認識して、読み替える必要がある。

・MFMailComposeViewControllerで送信するとメモリーリークが発生する
 下書き〜削除・保存すると発生しない
 宛先をメニューを選ぶだけでは発生しない   
  シミュレーター上だけかもしれない


・バックグラウンドでUIGraphicsGetImageFromCurrentImageContext()が取得できない
常にリターン値がNULLになる

・ナビゲーションバーのボタンのタッチ有効範囲はかなり広く、かつnaviが最優先されるため、それに隣接する領域ではタッチが検出できない。
ナビゲーションバーのすぐ下のあたりなど。
[lblBasicFile becomeFirstResponder];してもだめ

・[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];が2回連続でかかることがある
キーボードを閉じてないにもかかわらず「開く」が連続で通知されるため、順番に依存する処理で異常が起こる。
iOS5.0のみ発生。iOS5.1では発生しない。
日本語環境だけかもしれないが、英語環境では未検証。



・デジタルコンパスはメインスレッドで初期化しないと取得できない。
locationManager=[[CLLocationManager alloc]init];
をメインスレッド内で実行しないと、デリゲートが発生しない。

・CGContextRefで宣言したメンバーにはKVOが設定できない
 設定しても発生しない。

・実行時に Unknown class  ??? in Interface Builder file.と出るときは、そのクラスの.mファイルのTarget Membershipにチェックを入れる
Xcode右上のViewの一番右から

・[s drawAtPoint:point withFont:[UIFont fontWithName:fontName size:pointSize]];
で、pointSize=0だと<Error>: CGAffineTransformInvert: singular matrix.というエラーが出る。
エラーと内容があってない。

 ・UIWebViewへloadHTMLした場合、webViewDidFinishLoad以降でないと操作してはいけない

・ステータスバーのタップで先頭にスクロール
 editor.scrollsToTop    =YES;
スクロールさせたいもののみYESにし、他はNOにしなければならない

・UIView.transform=CGAffineTransformMakeTranslation(0, -fontWy);
で 平行移動がかかるのはUIViewのframeそのものであり、内容が移動するわけではない。
描画範囲も変わらない。
したがって、スクロール処理には使えない。

 ・HTMLの表示され方いろいろ
 Chrome            <pre>内にフォント指定は無効
 UIWebViewとChrome     <pre>と<table>内の改行の扱いが異なる

 Chromeは<table>内は<pre>が無効になっている。
  改行には<br>が必要で、スペースは無視される。
 UIWebViewはSafariとも異なる
 そのため、HTML表示確認は必ずUIWebView上で行わなければならない。

・UIGraphicsGetImageFromCurrentImageContext()はそれが含まれるコンテキストの内容だけを出力するのではなく、現在有効になっているすべてのコンテキストの内容を合成して出力してしまう。
多分、呼び出し時点までにUIGraphicsBeginImageContextされている全てのコンテキストだと思われる。

・CGBitmapContextCreateImage()にCGImageRetain()を付けたら画面がおかしくなる=メモリーリークする

・複数のコンテキストを使う場合、その切替には
  UIGraphicsPushContext(context);
  UIGraphicsPopContext();
が重要。これがないとコンテキストの切替後にエラーが出る。
ドキュメントではメインスレッド内で呼び出せとあるが、サブスレッド内でも問題ない。

・アプリケーション内フォントを追加する場合
必ずルート直下のサブディレクトリに置く必要がある
サブディレクトリの中のサブディレクトリ内は不可
これは他のリソースでも同じ。

・AirPrintはメインスレッドからしか実行できない
ポップアップを伴うので仕方ない様子。UIを持つものは全てメインスレッドで実行するのが慣わし。


おまけ
・Xcodeのsnapshotは過去に消したファイルも戻してしまうので、事実上使いものにならない。
えらい目にあった。
全保存したいなら、自分でzip圧縮化フォルダごとコピーするのが吉。



0 件のコメント:

コメントを投稿