Category Archives: Ios

NSDictionaryでkey=valueを指定したものからURLのクエリ文字列(param=value&param2=val2)を作るライブラリを書きました

pod 'NSDictionaryAsURLQuery'

でインストールできます。

使い方

NSString *results = [URLQueryBuilder buildQueryWithDictionary:@{
    @"param_1" : @1,
    @"param_2" : @"string"
}];
// => @"param_1=1&param_2=string"

という感じで、

[URLQueryBuilder buildQueryWithDictionary:dict];

と指定するだけの単機能なライブラリです。

面倒なURLエンコード等も適当にやってくれるので安全です。

iPadのiOS7.0.3(4) + 64bitの端末(iPad Airとかが該当すると思います)で発生するバグみたいですが、
MFMailComposeViewControllerをpresentViewController: などでモーダル表示するときに、
表示した瞬間に隠れてしまう現象です。

 

iOSシミュレーターのiPad Retina(64bit)でも再現できると思います。

この現象が起きた時に以下のようなエラーがコンソールに表示されます。

_serviceViewControllerReady:error: Error Domain=NSCocoaErrorDomain Code=4097 "The operation couldn’t be completed. (Cocoa error 4097.)"

原因としては、UIAppearanceで表示を変えてる部分でエラーが発生して閉じてしまうようです。

自分の場合は以下のようなUITabBarItem appearanceの変更が原因だったので、これを取り除いたら解決しました。

[[UITabBarItem appearance] setTitlePositionAdjustment:UIOffsetMake(0, -2)]

メールを表示する画面と全然関係ないところが原因のようなので、UIAppearanceを疑うのがいいと思います。

 

iOS6から使えるようになったUse Base Internationalizationでローカライズを対応してる時に、ハマる可能性がある問題についてのメモです。

起動画像のローカライズをする場合は、Xcode5から使えるようになったImage assertを使わないで、
Info.plistにLaunch Imageのベースとなる名前を入れて、Table 5-5 Launch image orientation modifiersに沿った命名で、
各サイズのDefault画像をローカライズして配置する必要があります。

 Launch image 2013 10 15 17 18 32

この時に、Default画像において、下記のようにBaseのチェックが抜けている場合に、Validationなどは通ってもSubmit後に Invalid Binary でリジェクトされます。

default

Invalid Binary となった場合は以下のような内容がメールで通知されます(Webから見られない)

iPhone 5 Optimization Requirement - Your binary is not optimized for iPhone 5. New iPhone apps and app updates submitted targeting iOS 6 and above must support the 4-inch display on iPhone 5 and must include a launch image with the -568h size modifier immediately following the {basename} portion of the launch image's filename. Launch images must be PNG files and located at the top-level of your bundle, or provided within each .lproj folder if you localize your launch images. Learn more about iPhone 5 support and app launch images by reviewing the iOS Human Interface Guidelines and iOS App Programming Guide.

✔Base に対してもローカライズのチェックを入れるとこの問題は解決します。

通常のデバッグだと対応してる言語で確認するので起動画像が普通に表示されて問題に気づかない場合があるので注意が必要です。 

iOS6とiOS7の対応するときに少し迷うのがナビゲーションのボタンについてですが、
どのようにして見た目を分けるかについてのメモです。

iOS7

iOS7だとUIAppearanceを使ったナビゲーションのボタン画像をつける処理が少しおかしい感じで、
画面毎に設定しなおさないと行けない感じに見えます(何か別の方法があるのかもしれません) 

そのため、バッサリボタン画像は捨てて、標準のテキストなボタンで表示することにしています。
なので、UIAppearanceなどはなにも適応しないで、tintColorなどを合わせているだけになっています。

ナビゲーションのtintColorを合わせるのに以下のようなサンプルアプリを使ってます。

iOS6

本題の内容はiOS6の話で、iOS6では今までどおりUIAppearanceでボタン画像を指定しています。

UIAppearanceで戻るボタン、通常のナビゲーションボタンのボタン画像が指定出来ますが、
通常のフローならこの2つで十分なのですが、例えば戻るボタンを押した時に確認画面を出すような実装をしている時に問題があります。

戻るボタン対してイベントを設定するような方法(検知はある)はないので、 navigationItem.leftBarButtonItem に対して、自分でイベントを設定したBarButtonItemを入れるということをすると思います。
この時にnavigationItem.leftBarButtonItemに入れるボタンの見た目は 戻るボタン と同じであって欲しいのですが、

-[UIBarButtonItem initWithCustomView:]

をつかってボタン画像を直接指定したButtonItemだとiOS7との見た目が両立出来ません。(UIButtonを使ったUIBarButtonItemだとiOS7でも画像ボタンになってしまう)

そのため、BackBarButtonItem.h のような UIBarButtonItemのサブクラスを作り、見た目は戻るボタンにしたいところではそれを指定するようにします。 

BackBarButtonItem *backBarButtonItem = [[BackBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(something:)];
self.navigationItem.leftBarButtonItem = backBarButtonItem;

そうすることで、UIApperanceから指定出来るボタンの種類が増えます。

この場合は、BackBarButtonItem に対して戻るボタンの画像を指定してあげれば、通常のナビゲーションボタンの動作と戻るボタンの見た目を持ったボタンが使えるようになります。

[[BackBarButtonItem appearanceWhenContainedIn:[UINavigationBar class],nil]
    setBackgroundImage:backButtonImage forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

まとめ

ナビゲーションのような汎用性がある部分は直接デザインを持ったボタンを指定しないで、
後からUIApppearanceなどで見た目をわけられるように、サブクラスで種類をわけておくなどすると見た目の変更に強くなりそう。 


#define MR_ENABLE_ACTIVE_RECORD_LOGGING 0

のように定義するとMagicalRecordのログを無効化出来るのですが、CocoaPods経由で入れると順番の依存などの問題によりログが無効にできない場合があります。 

そういう場合は、CocoaPodsでインストールする際に以下のような感じでPodfileにhookスクリプトを書くと、 Pods側のheaderに#define出来ます。

元ネタはios – Cocoapods: turning MagicalRecord logging off – Stack Overflowです。

CocoaPodsのHooksについて以下も参考にするといいかもしれません。