2014年6月30日月曜日

新サービスを立ち上げる企画者へ

梅雨の終わりが近づき、夏の暑さが顔をのぞかせ始めた今日この頃。
体調を崩さずに楽しく仕事をしていらっしゃるでしょうか?


iPhoneアプリを開発する際にリサーチは当然すると思われますが、
他社のサービスのリサーチの前にまずやってほしいことがあります。

Apple純正アプリのリサーチ

です。

なぜかというと、

Apple純正アプリのUIは実装するのに工数がそれほどかからない

からです。

開発は当然限られたリソース内で行う方が多いと思います。
その際にこれが効いてきます。

純正アプリのUIは好き嫌いあれど、多くのユーザーが使います。

これだけの規模使用されるとそれはもはやUXにも影響してきます。

よって、時間をあまりさけないUI等にはこの純正UIを用いるのが
とても効果を発揮するでしょう。



同様に、こういうサイトも参考にしていただけると開発者嬉しいですね。




さらにさらに、Appleの基本ViewControllerとかUIKit系を抑えていただけてると
もはやエンジニアの羨望の目を欲しいままにできるのではないでしょうか。


副産物として共通言語もでき会話もスムーズになります。
「UITabBarViewControllerのtabIndexが3の挙動おかしいよ~」
とか。
ないか。。。



若輩者のエンジニアより

2014年6月27日金曜日

UIPageViewControllerについて

電子書籍アプリのようなUIをつくる際には最適なViewController。

ただ、私が現在手掛けているアプリでは少々特殊なUIを採用しているため、
このViewControllerをベースにしています。



使っていて気付いた点

良い点
・複数のViewControllerに気持ちいいスクロール&ページングを実装するにはお手軽。

悪い点
・汎用性が低い




基本的な実装方法は

全体の親となるViewController(Navigationとかにしとくと楽)に
UIPageViewControllerをのっける。
あとはPageViewControllerのライフサイクル内で最初のページとなるViewContorollerをセットし、
UIPageViewControllerDelegateメソッドの

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
 viewControllerBeforeViewController:(UIViewController *)viewController;

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController
 viewControllerAfterViewController:(UIViewController *)viewController;

にて、前ページ、次ページのViweControllerを返すようにするだけです。

ここで、UIPageViewControllerを使用する際に、ほぼ確実に必要となるページ数の概念なんですが、
これがやっかい!

ページ数の管理を上記二つのメソッドだけで管理しようとしてハマりました。

どうやら上記二つのメソッドは、
初回にめくろうとしたタイミングでafter(before)のほうが二回呼ばれます。
これはページをめくった段階でさらに次のページまで生成してくれるからです。

これが落とし穴でした。


例えば、この二つのメソッドでページの管理をすると最初を0ページ目として、
afterに++、beforeに--を設定しておきます。
すると、1ページめくった際にLogをみてみると
0
1
2
となってしまうわけです。


解決方法

UIPageViewControllerを使用すると、どうしても内包するViewControllerで自分のページ数が必要になります。
これとさきほどの問題点を併せて、
上記二つのメソッドでViewControllerを作成しreturnする際に、各ViewControllerにページをセットしてやります。これで自分のページ数は解決。
さらに、このままではUIPageViewControllerのほうのページ数がずれたままなので、

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed;

これを使います。

これは読んで字のごとく、スクロール(ページング)のアニメーションが終了したタイミングで呼ばれます。ページングなので途中で話してページが戻った場合にも対応できます。
if (completed) {
  UIViewController *vc = [pageViewController.viewControllers objectAtIndex:0];
  pageIndex = vc.pageIndex;
  
  いろいろ
}

としておけば、めくりが終了した段階でUIPageViewControllerに現在表示されているページ数が設定されるわけです。 [pageViewController.viewControllers objectAtIndex:0]の書き方がものすごい気持ち悪いのは置いておきましょう。

これで基本的なUIPageViewControllerの使い方は網羅できたのではないでしょうか。


汎用性が悪いと書いたのは、まだまだこのUIPageViewControllerを使ってハマった点があるからです。
そのほかのハマった点と解決(逃げ)策はまた後程。






最近、人生初めて世に言う「ブランドもの」なるものを買ったのですが(9万円ほどのジミーチュウの財布)、買い物欲みたいなのが少しわかった気がします。
高い買い物をした際のえも言われぬ高揚感は、人間の生理的欲求のどれにも属さないかつ物欲とも若干異にするなにかしらの快楽が確かにあると感じました。

「欲」についての勉強をしたくなりました。

2014年6月26日木曜日

iPhoneアプリのメモリ管理のお話し。(ARC使用)

チームメンバーの方がメモリ調査をした結果わかったことなのですが、

「block関数内ではデフォルトで強参照してしまう」

です。

これはどういうことかというと、

self.abCallback = ^{
  [self amethod];
};

こういう事例でselfがabCallbackを強参照し、abCallbackによってselfが強参照化されてしまうので、
循環参照が起こりメモリが解放されません。

この場合は、

__weak typeof(self) blself = self;
self.abCallback = ^{
  [blself amethod];
};

と弱参照にしてやるのがいいようです。

また、これは、ブロックに限らずdelegate等でも起こりがちなので、
常に所有関係を意識するのが大事です。



全然関係ないですが、男女も弱参照ぐらいがちょうどいいと感じています。
強参照で循環参照とか恐ろしすぎて。。。

2014年6月18日水曜日

はじめに

iOSの開発を業務として行うのは初めてなプログラマーの視点で、
プロジェクトとして各立場の方々がiPhoneアプリの開発を行う際に

プログラマーはこう考えている
こういうUIを作る際に困った
プロジェクトとしてこういうことに困った
etc

という内容のことを思いついた、思い出したタイミングで
連ねていきたいと思います。

なんらかの方法でこの記事にたどり着いた方々は
暖かく見守りつつ、ご指摘いただけると助かります。