ラベル MFMailComposeViewController の投稿を表示しています。 すべての投稿を表示
ラベル MFMailComposeViewController の投稿を表示しています。 すべての投稿を表示

2014年9月26日金曜日

iOS8のバグもしくは動作違い(随時更新)

iOS8で挙動がおかしくなった処理を書いておく。今のところ、多くは回避コードは見つかってない。

(1)UIWebViewでローカル=リソース内のHTMLファイルもしくはPDFを表示している中から外部へのリンクをクリックすると、処理から帰ってこない
ローカルからローカル、外部から外部は大丈夫みたい。

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    return YES;    // 常に内部で開く・・・リンクをクリックするとそこで処理が止まる
}
->Xcode6のバグへ移動

(2) MFMailComposeViewControllerでメイラーを表示すると、一瞬表示されるが、数秒で勝手にキャンセルがかかってしまう。
    mail=[[MFMailComposeViewController alloc]init];
    mail.mailComposeDelegate=self;
    [mail setSubject:@"title"];
    [mail setMessageBody:@"message" isHTML:NO];
    [self presentViewController:mail animated:YES completion:nil];

以下のように書いているときは、閉じてしまう。 仮に閉じなかったとして、メイルは使える状態にはならない。

- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error
{
    [controller dismissViewControllerAnimated:YES completion:NULL];
    controller=nil;
}

拙作ではぷろぐらま〜ず電卓がe-Mailが使えない状態になっている。
Zeroレコーダーは開発中に気がついたので、iOS8上ではe-Mailを使えないようにした。
シミュレータ上だけの問題みたい。iOS8.0.2の実機では、開く前に警告が出ているが送信はできる。

どちらもiOS7では全く問題ないのでiOS8のバグの可能性が高い。


(3)UIWebViewのデフォルト背景色が黒に変わった
これは多分設定でなんとかなるかと。やってないけど。


(4)iPadで、ActionSheetのデリゲートの中からAirPrintのポップオーバーが表示されない

iPhoneでは問題ない。
回避策は、UIActionSheetではなく、iOS8で追加されたUIAlertControllerを使うこと。

ActionSheetから表示しようとすると、Warning: Attempt to present <UINavigationController: 0x????????>  on <表示しようとしているViewController: 0x????????> which is already presenting (null)
という警告が出て表示されない。全然わからなくて困っていたが、色々と表示条件を変えているうちにメッセージが変わり、上記のことがわかった。インターネットで調べても、stackoverflowを含めて見つからなかったので、世界初かも(^_^;)

UIAlertControllerはiOS8にはないので、バージョンを調べて処理を分ける必要がある。
また、iPhoneではUIActionSheetのままでも動くが、当然UIAlertControllerでも動く。

UIAlertControllerをiPadで使う場合は.popoverPresentationController.sourceViewと
.popoverPresentationController.batButtonItemまたは.sourceRectの設定が必須なので要注意。

メイラーの件はUIAlertControllerを使っても解決しない。

(5)WKWebViewでPDF内リンクが処理されない
PDF内にリンクがあった場合、UIWebViewではリンクが処理されるが、WKWebViewではタップが完全に無視される。回避策はない。リンク付きPDFを処理したいなら、現状WKWebViewは使えない。PDFの内部構造を解析してリンク情報を取り出し、別途ボタンを作って飛ばすとかは出来るんだけど、面倒。

(6)Tabbarでその他に入ったものから開いたViewControllerがTableViewを含む場合、
ステータスバーの部分をタップしても先頭までスクロールしない。
iOS7.1では発生、以前からそうなのかは不明。iOS8.1では修正されている。あっ、これはiOS8のバグじゃないね。

(7)NSAttributedStringでNSLinkAttributeNameを使った場合、下線が出ないことがある。出ない時はNSUnderlineStyleAttributeNameをつけても無視される。
出ることもある。truncateがあるときは表示されない。iOS7では問題ない。

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圧縮化フォルダごとコピーするのが吉。