UICollectionViewでheaderとfooterを使う

誤って10年近く使っていたサーバーを吹っ飛ばしてしまいログが消滅しました。
技術ブログは、はてな使ってて助かりました。


storyboardからheader / footerを追加する

さて、UICollectionViewでheader / footerを追加する方法について。
UITableViewでは、適当にViewでも引っ張って来てやれば追加できたりしますが
UICollectionViewの場合は、「Collection Reusable View」を使います。

これをCollectionViewに引っ張って行ってやればheader Viewは追加できますが
footer Viewは追加できません。では、どうするかと言うと

CollectionViewを選択して、AccessoriesからSection Footerにチェックを入れてやります。
そうすると自動的にfooter用のReusable Viewがセットされるはずです。


コードからheader / footerをカスタマイズする

header / footerそれぞれのReusable Viewのidentifierを設定した上で

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView 
 viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

この関数内のkindでUICollectionElementKindSectionHeader / Footerを判別して処理を書きます。
詳しくは、参考にした以下のサイトで解説されています。


kind (NSString* )の比較は、isEqualToStringでやった方がいいと思う。


◆【iOS】CollectionViewにヘッダーとフッター両方を追加する
http://qiita.com/kaktaam/items/6035708823f31d4530a1

◆ How to Add Header and Footer View in UICollectionView
http://www.appcoda.com/supplementary-view-uicollectionview-flow-layout/

Xcode6からベクター画像が使いやすくなった

Xcode6から、これまでビットマップ画像しか取り扱えなかった
Asset CatalogにPDF形式やJPEG形式がサポートされました。


そして、このPDF形式というものでベクター画像が取り扱えます。
※ただし、AppIconやLaunchImageには使えません


以下のサイトでも解説されているんですが、ちょっと違いそうな箇所があったのでこちらのブログに。
■ [Xcode 6] Asset Catalog でベクターが扱えるようになりました!
http://dev.classmethod.jp/references/xcode-6-asset-catalog-vector/


ベクター画像は拡大に対応していない、というよりは
1xのPDFで登録すると、自動的に2x、3xに変換してくれるようです。

■ USING VECTOR IMAGES IN XCODE 6
http://martiancraft.com/blog/2014/09/vector-images-xcode6/


そのため、40x40などのサイズでタブバーのアイコンに使いたい、というときなどは
大きめに100x100などで用意するのではなく、そのまま40x40のサイズの
PDFを登録するようにした方がよさそうです。
でなければ、storyboardなどからUIImageView以外に設定するときに困ることになります。


登録の仕方は参考サイトを見てもらえば分かりやすいですが、取りあえず解説

1. Asset Catalogの追加


New FileからAsset Catalogを選択して適当な名前で作成します。


2. PDFを、作成したAsset Catalogへドラッグ&ドロップ


3. TypesをVectorsにする


4. 登録した画像をALLに持って来る


5. ファイル名を指定して利用する

普通に、ファイル名を指定すれば使えます。この場合は「common_arrow」



そもそもベクターデータの作り方、なんて言うものはデザイナーに聞いてください。
Illustratorとか使えばできるらしいです。

新しいiTunesConnectで困ったこと

なんかiTunesConnectがレイアウト変わりまくってて、
バイナリのアップロード方法ががらりと変わってたので困りました。


バイナリをアップロードする

まず、ここから変わってました。


これまでは更新情報などを登録したあとに
「Ready to Upload Binary」を押してIDFAに関する質問などに答えてから
Xcodeからアップロードする形でしたが、今回から「まずアップロードする」形になっています。


アップロードされたバイナリの状況に関しては、

この「プレリリース」、「ビルド」の中で分かります。
「アップロード済み」から「処理中」に変わってると大丈夫なのかな?


レーティングを設定する

アップロードしたので「レビュー審査のために送信」を押すとこんなメッセージが出たりします。

You must submit your builds using Xcode 5.1.1 or later, or Application Loader 2.9.1 or later. 
After you’ve submitted a build, select it in the Builds section below.

今回から、レーティングの指定が追加されてますのでそれを登録しないとアップロードは成功しません。


ビルドを指定する

アップロードしたんだから、もう「レビュー審査のために送信」できるだろ、と思って送信を押すと
今度は以下のようなエラーが出たりします。

ITC.apps.validation.prerelease_build_missing

意味分からないし!!


よくよく、バージョン情報を下の方まで見て行くと気付いたら「ビルド」なんてタブが追加されています。

ここで「+」ボタンを押して、アップロードしたいビルドを指定すると
今度こそ「レビュー審査のために送信」ボタンが有効になりました。。。


あとは、IDFAに関する質問などに回答して、完了です。
本当に良くわからないインタフェースになったというか、ビルドの指定は一番上に持って来て欲しいところ。

Xcode6/iOS8対応で発生した問題など

取りあえず、現在対応中ですがXcode6 / iOS8にしたところで
諸々不具合が起きて来たので、メモ的に書いて行きます。


アプリ内で作成している画像の縮尺がおかしくなる

これは結局なところ元の実装がダメだったんですが、
マスク画像の読み込み→マスク画像のサイズを元にベース画像の作成
→マスク処理を行ってアイコンファイルを生成って処理をやってたんですが
ここで作られる画像が、iPhone5sまでとiPhone6以降では縮尺が違う問題が発生しました。


原因としては、iPhone6/6plusでは[UIImage imageNamed:]で読み込まれた
UIImage*型の画像のscaleが「2.0」になっており、
image.sizeで取得できる値がこれまでの1/2サイズになってました。


image.sizeによって処理を切り分けていただけのコードを、今後は
image.scaleをかけて計算する必要がありそうです。



NSObject型のプロパティにdescriptionを使ってはいけない

@property (copy, readwrite,nonatomic) NSString * description;

もともと、NSStringなどでdescriptionは予約語でしたが
NSObjectでもシステム的に使う様になったようです。(厳密になったというべきか)
self.description = x などを参照して setDescriptionを読んでしまうと強制終了するようになりました。



ALAssetsLibraryで全ての写真が取得できなくなった


これまでは、ALAssetsGroupSavedPhotosで取得できていた
「カメラロールの全ての写真」が、取得できなくなりました。
現在、このパラメータを使うと「最近追加した写真」しか取得できません。


おそらくはPhotos Kitを使えということでしょうが…。


ちなみに、UIImagePickerControllerを使えば、一応取得することは可能です。
ただし、アルバムが1つも存在しなくて最近追加した写真が1枚も存在しないと、
なぜか「全ての写真」まで表示されなくなります。


ちなみに、こんなバグ報告は上がってるみたいですね。
iOS 8 GM: ALAssetsGroupSavedPhotos no longer returns all photos in the camera roll
http://openradar.appspot.com/18286487


画面更新のタイミングが変わっている


なんか、変わってますね・・・ちょっとこれは調査中ですが
画面上でhidden状態のUICollectionViewCellに乗っている
UILabelでの、sizeToFitが効いてない感じになってます。

Xcode5でRun Scriptを追加する

デバッグツールをインストールしてたんだけど、
Build PhasesにRun Scriptが無くてちょっと困ったのでメモ書き。


ここにあります。追加したいターゲットを選択してる状態で、
「Editor -> Add Build Phases -> Run Script」

【iOS6以上】UIPageControlの色を変更したい

UIPageControlのページを表してるドットの色を変えたい場合。
OS6以降だとかなり簡単に変えれるようになってた。

@property(strong, nonatomic) UIPageControl *pageControl;

...

// デフォルトの色
self.pageControl.pageIndicatorTintColor = [UIColor blueColor];
// 選択されてるページを現す色
self.pageControl.currentPageIndicatorTintColor = [UIColor greenColor];

collectionViewCellのサイズを変えたい

UICollectionViewCellを特に調べもせずに適当に使っていたので、
要素によって横幅とか縦幅変えるためのキーになる関数知らなかったので
同じような人もいるかなとメモ書き程度に。

- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
{
   return CGSizeMake(width, height);
}

UITableViewとかは-(CGFloat)だからCGFloatで探してて見つからなかったわ…。