甘いものが好きです

iOS App開発時に感じた疑問や課題、その他の雑感などを書いていきます。

iOS App開発

UIWebViewのコンテンツ読み込みメソッドで最近はまったこと

UIWebViewには、表示するコンテンツを読み込むためのメソッドとして、次の3つが用意されている。 loadRequest: loadHTMLString:baseURL: loadData:MIMEType:textEncodingName:baseURL: これらのメソッドはコンテンツ読み込みを行うという点では同じだけれど…

iOS 7 GUI for Sketchが出ていたことに今日気がついた

かつてSketch*1を購入したときに、iOS AppのUIモック制作に役立つデータをいくつか集めていた*2のだけれど、その後デザインが全面的に刷新されたiOS 7がリリースされたことにより、これらのモック制作用データが使えなくなってしまった。そのため、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の認可を受けてい…

Camera Overlay Viewを設定するとiOS 7.0以降でアプリが操作不能になる問題への対処方法

UIImagePickerControllerを使った写真撮影機能を実装していたとき、iOS 7未満では何の問題もない次のようなコードを実行すると、iOS 7.0以降ではシャッターボタンをタップして写真撮影を行ったぐらいのタイミングでアプリが操作不能になる現象が発生した。 -…

SketchでiOS App用の画像素材を作成するのに役立つ情報をいくつか

先日の半額セールの際に勢いでSketchを買ってしまった。自分がSketchを使うのは、おそらくiOS App用の画像素材を作成する場面がほとんどだろうと思う。そこで、iOS App用の画像素材で作成するのに役立ちそうな情報を集めてみた。

Xcodeのドキュメンテーション閲覧用にDashをインストールしてみた

APIドキュメントを閲覧する上で「Dash」というアプリが便利だという情報を目にし、無料だということもあってさっそくインストールしてみた。 Mac App Store - Dash (Docs & Snippets) インストール後、初回起動時にXcodeのドキュメントを読み込まれ、すぐに…

実行時警告「Attempt to dismiss from view controller while a presentation or dismiss is in progress!」への対応

EventKitを利用したAppを開発していたとき、イベント編集画面のView Controller*1上で「完了」/「キャンセル」/「イベントを削除」のいずれかのボタンがタップされたタイミングでこのView Controllerをdismissするために、eventEditViewController:didComple…

UIImagePickerControllerでデバイスの向きの変更を無視する

UIImagePickerControllerを利用して写真を撮影するとき、Portrait固定にしたいのになかなかできず苦労した。 失敗例 以下の方法を試してみたが、うまくいかなかった。 Xcodeのビルドターゲットの設定で「Supported Interface Orientations」を「Portrait」の…

MRCとARCの両方に対応したコードをシンプルに書く方法

MRC(Manual Reference Counting)とARC(Automatic Reference Counting)の両方に対応したコードを書くためには #if __has_feature(objc_arc) #if __has_feature(objc_arc_weak) という分岐により条件つきコンパイルをしなければならない。 今となっては少…

文字列(NSStringオブジェクト)を画像化する方法

文字列を画像化する方法を調べてみたら、オフスクリーン描画をしてグラフィックスコンテキストから画像を得る方法が簡単だった。 Page not found · GitHub Pages 上記のページを参考にして、指定されたサイズの領域の中央に文字列を描画して画像化するコード…

ビルドエラー「While reading ... pngcrush caught libpng error」への対処方法

Xcodeプロジェクトで使用している画像を新しいものに差し替えた後、実機をターゲットにしてビルドすると以下の3つのエラーが出るようになった。*1 While reading [プロジェクトで使用している画像へのフルパス*2] pngcrush caught libpng error: Could not f…

In-App PurchaseでProductsRequestの応答にInvalid Product IDが含まれる場合にチェックすべきこと

In-App Purchase(アプリ内課金)で課金対象プロダクトについての情報を取得するときなどには、SKProductsRequestオブジェクトに対してstartメッセージを送信する。 - (void)sendProductsRequestWithProductIdentifiers:(NSSet *)identifierSet delegate:(id…

Outletにはweakを使う

きっかけはひとつのツイートから。 .@mfks17 あ!IBoutletも弱参照か。。。 @iphone_dev_jp [@tokyopengwyn]— iphone_dev_jp (@iphone_dev_jp) June 8, 2012自分はARCを利用するようになってからもずっと、weakではなくstrongを使用してOutletをプロパティ宣…

エラー「Couldn't register [App Identifier]」への対処

実機やシミュレータでiOS Appのデバッグをしようとすると、Appの起動前に次のようなエラーメッセージが出てAppが実行できないことがある。 Couldn't register App Identifier with the bootstrap server. Error: unknown error code. This generally means t…

Static Libraryでカテゴリを使用する場合の注意点

カテゴリの定義を含むStatic Libraryを使用すると、そのカテゴリで定義しているメソッドを呼び出すところで例外が発生してプログラムがクラッシュしてしまうことがあった。原因を調べてみたところ、まさに次の記事で説明している通り、リンカフラグに "-ObjC…

個人情報保護に配慮したAddress Book Frameworkのラッパークラス

アドレス帳情報にアクセスする前にユーザに許可を求め、許可が得られたらハッシュ化した連絡先情報を使用する。MITライセンス。crossforward/HashedContacts · GitHub

NSFetchRequestが返す結果のタイプを設定する

NSFetchRequestクラスのインスタンスメソッドexecuteFetchRequest:error:によってフェッチ処理を行うことができる。フェッチ結果は配列(NSArrayオブジェクト)形式で得られる。この配列の各要素はデフォルトではNSManagedObjectオブジェクトだが、フェッチ…

BTServerのCPU使用率が非常に高くなる問題はXcode 4.2.1で解決?

Xcode 4.2でBTServerのCPU使用率が非常に高くなる問題 以前、Mac OS X 10.6.8 + Xcode 4.2の環境下でBTServerのCPU使用率が非常に高くなる件について記事を書いた。 Xcode 4.2付属のiOSシミュレータを起動し続けるとBTServerのCPU使用率が非常に高くなる(追…

通話履歴情報にアクセスする方法を調べてみたが…

iOS Appが通話履歴情報にアクセスする方法がないか調べてみたら、このような情報を発見。 Accessing iPhone Call History | Bushra Shahid's iOS stuff ios - How to get call history from iphone? - Stack Overflow iOS5より前のバージョンのiOSでは次のフ…

マルチスレッドでCore Dataを利用する場合にはスレッドごとにManaged Object Contextを用意する

Managed Object Contextはスレッドセーフではない Core Dataを利用するiOS Appの処理の一部をマルチスレッド実行するように修正したところ、実行時エラーが発生して強制終了するようになってしまった。このときデバッグコンソールには次のようなメッセージが…

使いこなすと便利な文字列出力関数

普段はiOS Appばかり書いているのだけれど、たまにMac Appを書く機会がある。iOS Libraryとは勝手が違う部分のあるMac OS X Libraryに少々戸惑いつつも、本を読んだりネットで調べ物をしたりしながら書く。先日、参考にしていたソースコードでNSLogで出力す…

Twitter Frameworkでツイート機能の実装が容易になった

ツイート機能の実装が容易になった iOS5でiOS SDKに追加されたTwitter Frameworkを使うと、Twitter APIを利用するiOS Appを簡単に作成することができる。従来はTwitter社にxAuth利用申請を行うなどの事前準備が必要だったが、このTwitter Frameworkを使用す…

複数のStoryboardファイルを使ってViewの遷移を行う方法

Storyboardを使用することによって、1つのファイルで複数のViewの内部構成や各View間の遷移する様子を設計することができる。ところが、Viewの数が多いプロジェクトでは、1つのStoryboardでそれらのViewを一括管理しようとすると、従来のXibファイルを用いた…

通信速度が非常に遅い時のAppの動作を確認する方法

Appの通信機能が正しく実装されているかを確認上では、通信速度が著しく低い場合や、通信が途中で途切れる場合の対処までもを確認しなければならない。ところが、確認のために理想の通信状況を用意しなければならないので、実機で確認することは難しい。App…

appearanceプロキシを使ってUI要素の外見を一括カスタマイズ

iOS 5.0より前のバージョンのiOS SDKではUI要素の外見をカスタマイズするためには、 各オブジェクトごとにプロパティの変更等の個別設定を行う サブクラス化してdrawRect:をオーバーライドする などの方法をとらなければらななかったが、iOS 5.0では各種UI要…

Xcode 4.2付属のiOSシミュレータを起動し続けるとBTServerのCPU使用率が非常に高くなる(追記あり)

Xcodeでビルドと実行した際に立ち上げたiOSシミュレータをそのまま起動しっぱなしにしておくと、BTServerというプロセスのCPU使用率が100%近くに達してMacのファンがうなりをあげる。発生した環境は次のとおり。 Mac OS X 10.6.8 Xcode 4.2 (Build 4C199)*…

iOS 5 SDKで新登場したStoryboardの基本的な使い方

iOS 5 SDKで「Storyboard」が新登場した。新規プロジェクト作成の際に「Use Storyboard」というラベルのついたチェックボックスが表示される。ここにチェックを入れてプロジェクトを作成すると、そのプロジェクトにはデフォルトで「MainStoryboard.storyboar…

iOS 5.0ではUIActivityIndicatorViewが表示されなくなる場合があることに注意

iOS 5.0ではUIActivityIndicatorViewが表示されなくなることがある UIActivityIndicatorViewを使用しているプロジェクトをXcode 4.1以前で作成し、そのプロジェクトをXcode 4.2でiOS 5.0向けにビルド・実行すると、UIActivityIndicatorViewが表示されないこ…

Localizable.strings編集後に起こるビルドエラー「validation failed: The data couldn’t be read because it has been corrupted.」

半年に1度くらいしてしまうミス。二度としないと誓いながらメモ。Localizable.stirngsを編集した後でビルドすると、次のようなエラーが出ることがある。 error: validation failed: The data couldn’t be read because it has been corrupted. ファイルが壊…

エラー「Error Starting Executable '[App名]'」への対処

エラー内容 Xcode*1でBuilding SettingsのCode Signingを変更した後で実機(iPod touch / iPhone / iPad)を対象として「ビルドと実行」をすると、ビルドに成功しデバイスにAppがインストールされたところで次のようなエラーダイアログが表示され、Xcode経由…

警告「Multiple build commands for output file」への対処

Xcodeのプロジェクトにファイルを追加した後でビルドを行うと、次のような警告が大量に出てしまうことがあった。*1 Check dependencies [WARN]Warning: Multiple build commands for output file /Users/____/Library/Developer/Xcode/DerivedData/____/Buil…

Current Transformation Matrixとは

Quartz 2Dの関数、CGContextTransformCTM, CGContextRotateCTM, CGContextScaleCTMなどに含まれる「CTM」とは一体何なのだろうか。調べてみると、Quartz 2Dで描画する上で前提となる2つの座標系(デバイス空間/ユーザ空間)やユーザ空間の変換の話に行き着く…

Xibファイルのローカライズの方法と注意点

XcodeでXibファイルのローカライズを行う方法。*1Xcodeでローカライズ対象のXibファイルを選択してアクティブにしている状態で、File Inspactorの「Localization」セクションにある「+」および「-」ボタンを押下することにより、ローカライズを行うことがで…

UIWebViewの使用上の簡単な注意

UIWebViewを使用する上での簡単な注意点をいくつか。 UIWebViewオブジェクトはリリース前にdelegateにnilを設定しておくこと リリース前にdelegateにnilを設定しておく必要があるのは、次のページで詳細に説明されているように、UIWebViewのロード処理が別ス…

エラー「putpkt: write failed: Broken pipe」への対処

Xcode*1でビルドして実行しようとしたとき、Appが立ち上がる直前くらいのタイミングで「putpkt: write failed: Broken pipe」というエラーダイアログが表示され、Appが実行できなくなることがあった。デバイス側でいったんAppを削除したり、Xcode側でクリー…

Xcodeのエディタで文字コード変換を行う

Xcodeのエディタ内で日本語を使えない(打ち込むことができても、ビルド時に警告が出たり、編集後のファイルを他のアプリケーションで読み込むと文字化けしてしまう)場合には、適切な文字コード(例えばUTF-8)に変更すればよい。*1Xcodeで対象のファイルを…

Popover内のNavigation Controllerのpush/popに応じてPopoverのサイズを調整する

iPad AppでPopover内にNavigationベースのViewを表示するときの話。*1 Popoverのサイズが元に戻らないことがある Navigation ControllerのRoot Viewのサイズが、その1つ下の階層のView(ここでは「Second View」と呼ぶ)のサイズよりも小さい場合、Second Vi…

NavigationControllerが管理するViewControllerのviewWillAppear:animatedおよびviewDidAppear:animatedがコールされない場合の対処方法

UITabBarControllerで複数のNavigation Controllerを切り替える形式のUIを実装し、動作確認してみた。すると、各Navigation Controllerが管理するView ControllerではviewWillAppear:animatedおよびviewDidAppear:animatedがコールされていないことに気がつ…

タブ選択時に選択されたタブに対応するViewControllerのRootViewを表示する

iOS Appではタブ選択時には対応するViewControllerのRootViewを表示すべき? - 甘いものが好きです上記リンクの記事では、タブ選択時にはそのタブに対応するViewControllerのRootViewを表示すべきことがAppleの資料に記載されていることを指摘した。そこで、…

iOS Appではタブ選択時には対応するViewControllerのRootViewを表示すべき?

UITabBarControllerの各タブにNavigationベースのViewを対応づけておく場合、実装方法によっては、あるタブに対応するViewで階層を掘り下げて表示している状態でタブを切り替えてからまた元のタブに戻したときに、下の階層が表示されたままになってしまう。…

searchResultsTableViewのスタイルをGroupedにするのは無理?

iOS SDK 4.3現在の話。UISearchResultControllerを使用して検索機能を実装している。検索結果を表示するTableView (searchResultsTableView) 上で、1件の検索結果に対して複数の項目を表示したい。1つの項目だけであれば、TableViewのスタイルをPlain (UITab…

CCMenuItemImageのインスタンス作成時に指定するメソッドのシグネチャに注意

Problems with the new cocos2d version 0.99.1上記記事はcocos2d for iPhoneのVer. 0.99.1での話だが、今回はVer. 0.99.5でこれと同じ現象に遭遇した。CCMenuItemImageのインスタンス作成時に例外が発生したのだが、原因はわかってしまえばたいしたことはな…

配列(NSArrayオブジェクト)内の要素の重複を取り除く方法

配列(NSArrayオブジェクト)が要素に同一オブジェクトを複数含んでおり、その重複を取り除きたい場合には、配列内のオブジェクトをもとにしていったんNSSetオブジェクトを作成し、直後にそのNSSetオブジェクトの全要素を配列形式で取得すればよい。具体的に…

CAAnimation終了時にアニメーションを区別して追加処理を行う

Core Animationを使用してアニメーションを実装する際に、アニメーション終了時に追加処理を実行させたいことがある。例えば、あるImageViewを回転させるアニメーションを行い回転終了時にその角度のまま静止させる、といったことをやりたい場合を考えてみよ…

UIViewのアニメーションの二重実行を防ぐ

UIViewのアニメーションの二重実行を防ぐためには、実行開始時にフラグを立てて実行終了後にフラグを落とせばよい。UIViewクラスのクラスメソッドsetAnimationDelegate:でdelegateを設定すると、アニメーションが終了したタイミングでdelegateのanimationDid…

他人から受け取ったXcodeプロジェクトのビルド時にCode Sign errorが出たら

同僚から受け取ったXcodeプロジェクトをビルドして実機で実行しようとすると「Code Sign error: [...] doesn't match any valid certificate / private key pair in the default keychain」というエラーでビルドに失敗することがある。既に何度か経験したの…

Interface Builder上でのシステムパターン色はiPhone用とiPad用とで区別されている

iPhone/iPadのユニバーサルアプリの制作中、Viewの背景色をInterface Builderで設定したにもかかわらず、ビルドと実行をしてみるとそのViewの背景色が設定とは違う色(真っ赤)になっていることがあった。原因を調べてみると、これはInterface Builder上で設…

TableViewの各セル内にボタンを配置し、どのボタンがタップされたかを判別可能にする

iOS Appにおいて、TableView内の各セルにボタンを配置し、それらのボタンのうち1つがタップされたときにどのボタンがタップされたかを判別可能にしたい場合、どのような実装を行えばよいのか。簡単な実装例を1つ示す。 ボタンクラスのカスタマイズ UIButton…

iPadのModal Viewで表示したキーボードが特定条件下でコード上から非表示にできなくなる

iPad App内でModal Viewを表示し、そのModal View内でキーボードを表示したところ、そのModal View自体を消さない限りキーボードをコード上から非表示にできなくなった。この件についていろいろと調べてみたので、以下にまとめることにする。特に断りがない…

cocos2d for iPhone(Ver. 0.99.5)でRetinaディスプレイ対応

cocos2d for iPhoneを利用したiPhone AppでRetinaディスプレイ対応するための方法をメモしておく。対象バージョンについての記載が特にない限り、現時点で公開されている最新バージョンのVer. 0.99.5における方法とする。また、Retinaディスプレイと区別する…