2014年9月26日金曜日

Xcode6のバグ

ついでにXcode6のバグ(6.0.1〜6.1)。

(1)シミュレーターで時々一切のタッチを受け付けなくなる
動作してない気もする。

シミュレータの再起動で治る。6.1では発生していない。

(2)シミュレーターでキーボードが表示されない
beginFirstResponderしてもキーボードが表示されない。当然でキーボードが閉じるときの通知も来ないため、そういう処理をしていると異常になる。自作のものは仕事で作ったものも含めすべてアウトだった。

iOSシミュレーターからHardware→Keyboard→Connect Hardware Keyboardのチェックを外すと治る。Xcode5まではソフトウエアキーボードを出したままキーボードからの入力もできただけにものすごく面倒。

6.1でも同じ。

(3)UIButtonやUIImageViewに設定していた画像が外れてしまう
Images.xcassetを追加した時に発生するのかもしれない。
使えてた機能が使えなくなるので一番厄介。

(4)シミュレーターをiOS8にすると、UIWebView/WKWebViewがhttpに接続できない。
完全にiOS8シミュレーターのバグ。シミュレーター上のSafariでも同じ。
httpsにはつながる。
6.1ではSafariではhttpでも接続できるようになったが、UIWebView/WKWebViewは直ってない。

(5)IBでAutoresizeingの設定ができなくなることがある(矢印をクリックしても反応しない)。
一旦別の要素に切り替えて戻ってくると出来るようになる。
6.1でも治ってない。

(6)アプリ申請のためのVaridateをして、何らかの問題が発生したときのエラーメッセージが見当違いな物を出すことがある。
全く内容がわからないのでXcode5でやったらすぐわかった。メッセージが間違っているというか意味不明のが出てた。

(7)Commitのコメントを入力中に改行すると、カーソルが変な場所に飛んでしまう。

(8)シミュレーター内の設定でキーボードを選択しても反映されない
(設定してない=変更前のキーボードのままになる)
削除してても。

なんにしても、まだXcode5は外せない状況。アップルの製品はソフトもハードもバグや故障が多すぎ。もっと検証しろ、品質上げろ!

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では問題ない。

2014年9月14日日曜日

iOS7でのdrawAtPoint/drawInRectについて

iOS6までに存在したNSStringの
 - (CGSize)drawAtPoint:(CGPoint)point withFont:(UIFont *)font
 - (CGSize)drawInRect:(CGRect)rect withFont:(UIFont *)font
はiOS7で非推奨になった。

代替メソッドとしては
 - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs
 - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs
が紹介されているが、実はこれらには描画色に関して重大な違いがある。

代替メソッドについて書かれてるサイトはあったけど描画色について書かれているところは見つけられなかったのでここに書いておく。

iOS6の

 - (CGSize)drawAtPoint:(CGPoint)point withFont:(UIFont *)font
 - (CGSize)drawInRect:(CGRect)rect withFont:(UIFont *)font

は[UIColor set]で設定された現在の描画色で描画されるが、iOS7の

 - (void)drawAtPoint:(CGPoint)point withAttributes:(NSDictionary *)attrs
 - (void)drawInRect:(CGRect)rect withAttributes:(NSDictionary *)attrs

はそれでは描画されない。常に黒になる。

 ではどうやって描画色を指定するかといえば、attrsに入れる。すなわち、
    NSDictionary *atrb=@{
                         NSFontAttributeName : font,
                         NSForegroundColorAttributeName:color
                         };
    [self drawAtPoint:point withAttributes:atrb];
である。

本当なら[UIColor set]で設定された現在の描画色を得る方法があれば、それを読み取ってcolorに入れればいいが、その方法がないので、、描画色は他に変数に入れて管理しておく必要がある。

アップルはこういう重大な変更を平気でするから困る。変えるなら変えるでちゃんと告知して、正確な代替案を出してほしい。このことがわかるのに半日もかかってしまった。

X-BASIC for iOSの次バージョンは、この問題を超えて発表まであと少し。今回は機能追加なし。