なるようになるかも

力は多くの場合、その人の思いを超えない。

UIKit徹底解説読んでる。

StoryBoardに乗り遅れてる感があるので手にとってみたのですけど、いい本です。まだ完全に読み込めてないのでざっくりとした感想ですけども。

UIKit徹底解説 iOSユーザーインターフェイスの開発

UIKit徹底解説 iOSユーザーインターフェイスの開発

特にUIFontDescriptorまわりについては、これほど丁寧な解説は存在しないと思います。

StoryBoardを駆使してコード量を減らしつつTODOアプリを作る章など、読み応えのある本でした。

iOS6と7による違いのトラップについても随所に述べられています。

ただUIKitの処理について徹底的に書かれているかというと、ヒットテストビューやレスポンダチェーンについての解説はイベント処理ガイド(iOS用)をほぼなぞりつつ、ジェスチャレコナイザのiOS7用メソッドに関する解説が付け足されているような感じでした。

いくつか食い足りない感じの場所もありました。

UIAppearanceの話

UIAppearanceの外観設定についても割とあっさりでした。

実行時にしか反映されないから、StoryBoardとの相性は悪いのでしょうがないのかも。

そもそもクラスリファレンスにどのプロパティがUIAppearanceに対応してあるのか書いていないという致命的な問題があって、ヘッダファイルにUI_APPEARANCE_SELECTORマクロが定義されているかを追っかけて回るわけですけど、SDKバージョンによって予告なく変更されたり、指定されていなくても実は使えたりとか、iOS7でtintColorの解釈が変わったりとか…。

まともに使えたものじゃないですんですよね。

それでも現状、UIButtonの見栄えを統一したいときは、resizableImageWithCapInsets:resizingMode:で縮尺の設定をした画像を、UIAppearance経由でsetBackgroundImageなどに設定するのが、便利だし実装コストも低い方法だと思っているのですけれど、IBやSBに反映されないというのはやはり痛くて、iOS7に置き換わっていくとアセットカタログのスライシングに流れていくんでしょうか。

iOS7以降ではtintColorでアプリのテーマカラーを決めて欲しいように見えますし。

AutoLayoutの話

この本はAutoLayoutをStoryBoardで扱う方法について相当力を入れて解説していますけども、コード上で扱う方法についてはVisual Format Languageで少し言及しているだけです。

Visual Format Languageのヒドさは今更言及する必要はないかと思いますが、ではこれを使わずまともに制約を書こうとすると、これがまた難解というか面倒でやってられないんですよね…。

SB任せでも基本的には問題ないんですけど、制約ベースでアニメーションをしようと思うと、制約を修正(場合によっては一度消してから再生成)して、アニメーションブロックでlayoutIfNeededを呼ぶ必要があるので、複雑な制約が付いているビューを動かす状況など、コードベースの制約についての理解もそれなりに必要なんじゃないの?という気がします。

ところで本書にも制約ベースのアニメーションに関する記述が若干載っていて、そこでは制約を相対的に操作して、layoutSubViewsを呼び出しているのですけれど、UIViewのクラスリファレンスなど読むに、

You should not call this method directly. If you want to force a layout update, call the setNeedsLayout method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the layoutIfNeeded method.

layoutSubViewsの直接呼出しって作法として微妙なんじゃないのかな?

ここでのshould notは「推奨されない」程度の意味だと思いますけど。

XCode6の話

NDAの関係で白昼夢なんですけど、XCode6で個人的に一番インパクトのある変更点は、IBやSBがdrawRect:を解釈してくれることなんですよね。

今までカスタムビューを作っても、IBやSB上では透明なビューにしか見えなかったのですけど、これで面白いコントロール系ライブラリがまた増えてくる可能性があります。もっともコントロール系は暗黙アニメーションを利用するために、drawInContext:で実装する方が多い気がしますけど…。

本書ではカスタムビューの説明をかなり端折ってあって、そこがちょっと勿体無いなーという感想でした。

ついでに言えば、drawRect:のライブレンダリングの説明には、intrinsicContentSizeを解釈してくれるという記述は見当たらないから、AutoLayout上にカスタムビューを配置するにはプレースホルダーを指定しなきゃいけないという残念な仕様はそのままな気がします。