UIWebViewのコンテンツ読み込みメソッドで最近はまったこと
UIWebViewには、表示するコンテンツを読み込むためのメソッドとして、次の3つが用意されている。
- loadRequest:
- loadHTMLString:baseURL:
- loadData:MIMEType:textEncodingName:baseURL:
これらのメソッドはコンテンツ読み込みを行うという点では同じだけれど、メソッドに渡す引数の形式が異なるし、挙動が異なる部分もある。Class Reference等に記載がなく、違いに気がつくまでに時間がかかり少々苦労したこともあったので、ここに情報をまとめておく。
続きを読むiOS 7 GUI for Sketchが出ていたことに今日気がついた
かつてSketch*1を購入したときに、iOS AppのUIモック制作に役立つデータをいくつか集めていた*2のだけれど、その後デザインが全面的に刷新されたiOS 7がリリースされたことにより、これらのモック制作用データが使えなくなってしまった。そのため、Sketchの最近の用途はスクリーンショットの加工が多く、UIモック制作に利用することは全くなくなってしまっていた。
今日、あまり作業時間に余裕がない状況下でスクリーンショットの加工にSketchを使い、改めて操作のしやすさに惚れ惚れした。そういえば、UIモック制作にSketchを使おうと思っていたことがあったな。そろそろiOS 7版のSketchデータが出ているかもしれない。ふとそう思って探してみたら……あった!
ここまでいろいろなパーツが用意されているのは本当にありがたい。公開日は2013年11月7日なので、約4ヶ月間このデータの存在に気がついていなかったことになる。社内でSketchユーザが増えてきているので、Sketchでデザインデータをやりとりすることも検討したい。
estimote beaconsのDeveloper Preview Kitが届いた
estimote beaconsのDeveloper Preview Kitが仕事場に届いた。
estimote beaconsのDeveloper Preview Kitが届いた。 pic.twitter.com/Gf2yNOXsd3
— Shadow (@capt_shadow) February 2, 2014
パッケージにも書かれているとおり、これはまだFCC/CEの認可を受けていない評価用の開発キットだ。
カバーを外すとメッセージカードが入っていて、宛名とEstimote, IncのCEOであるJakub Krzychのサインの部分が手書きだった。
こういうちょっとした個別対応がうれしい。 pic.twitter.com/kuYVZThaLS
— Shadow (@capt_shadow) February 2, 2014
Developer Preview Kitにはbeaconが3つ入っている。
estimote beaconsのDeveloper Preview Kitの中身はこんな感じ。 pic.twitter.com/yGzwvclrEC
— Shadow (@capt_shadow) February 2, 2014
estimoteのiOSアプリ内で提供されているデモの一部については、estimoteのiOS SDKとともにGitHubでソースコードが公開されている。試しにDistanceDemoを少しいじってビルドしてbeaconの認識のされ方を確認してみたら、自席に置いたbeacon3つが部屋を出たくらいのところで1つも認識されなくなった。これを使った勤怠アプリなどを簡単に作ることができそうだ。アイデア次第では広告系でも面白いことができそう。もう少しきちんと使い方を把握しておかなくては。
Camera Overlay Viewを設定するとiOS 7.0以降でアプリが操作不能になる問題への対処方法
少し前の話。UIImagePickerControllerを使った写真撮影機能を実装していたとき、iOS 7未満では何の問題もない次のようなコードをiOS 7.0以降で実行すると、シャッターボタンをタップして写真撮影を行ったぐらいのタイミングで以降のアプリ操作不能になる現象が発生した。
- (void)launchCamera { if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) { UIImagePickerController *pickerController = [[UIImagePickerController alloc] init]; pickerController.sourceType = UIImagePickerControllerSourceTypeCamera; pickerController.delegate = self; UIImage *image = [UIImage imageNamed:@"OverlayImage"]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; imageView.image = image; imageView.contentMode = UIViewContentModeScaleAspectFill; imageView.userInteractionEnabled = YES; pickerController.cameraOverlayView = imageView; [self presentViewController:pickerController animated:YES completion:NULL]; } }
処理を部分的にコメントアウトしながら挙動を確認して直接の原因と思われる箇所を限定していくと、
pickerController.cameraOverlayView = imageView;
という処理が入っている場合にのみ現象が発生することが明らかになった。そこで、iOS 7におけるCamera Overlay Viewについて情報収集してみたところ、AppleのDeveloper Forumsでこの問題が取りあげられている場所があるのを発見した。(https://devforums.apple.com/message/890325#890325 。閲覧には開発者登録が必要。)
Developer Forumsでの回答を参考にすると、Camera Overlay ViewがpointInside:withEvent:でNOを返すようにすることでこの問題を解決できるようだ。そこで、UIImageViewのサブクラスを作成し、pointInside:withEventを次のようにオーバーライドするようにした。
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event { return NO; }
このカスタムImage Viewクラスを使ってCamera Overlay Viewを設定したところ、iOS 7.0以降でも写真撮影後に正常に処理を継続することができるようになった。
以下は蛇足というか教訓というか。
UIImageViewPickerControllerのように、クラス自体は古くから存在している場合、これまでのバージョンのOSでは正常動作しているコードでも、新しいバージョンのOSでのみ問題となることがある。そのようなときに、いざ原因特定のための情報収集してみると、クラス名等のキーワードだけでは無関係の情報がヒットしやすく、調査が少々難航してしまう。
新しいOSバージョンでのみ発生する問題について調査する場合、(少なくともiOSやOS Xに関する問題については)Developer Forumsは比較的に質の高い情報が得られるのだと実感した。iOS 7はiOS 6までと比べてリリース直後のこのようなちょっとした問題に遭遇することが多いので、意識的にDevelop Forumsを活用していこうと思った。
Appleに交換依頼していたケーブルが届いた
昨日交換依頼を出したケーブルが本日さっそく届いた。かなり対応が早かったので驚いた。運送業者からの受け取り時に破損ケーブルを運送業者に渡す必要があった。*1
届いた新品のケーブルの動作確認。問題があればアップルサービスセンターまで電話連絡する必要があるとのことだが、確認の結果、問題がなかったので今回の手続きはこれで完了となった。
*1:運送業者に旧部品を渡さない限り新部品を受け取れないシステムらしい。
AppleCare登録済iPhone 4Sに付属していたケーブルの交換依頼を出してみた
先日、iPhone 4Sに付属していた30ピン-USBケーブルの皮膜が破れて断線寸前になってしまった。
ついにDockケーブルが逝った pic.twitter.com/yzuH0Vafk9
— Shadow (@capt_shadow) June 12, 2013
Dockケーブルは一応AppleCareのサポート対象に入っているみたい。 https://t.co/fHq7RKCosa
— Shadow (@capt_shadow) June 12, 2013
このiPhone 4SはAppleCareに登録済だったので、Appleのサポートページから交換依頼を出すことにした。
続きを読む