SlideShare a Scribd company logo
1 of 62
Download to read offline
UICollectionViewLayoutで
              カバフローを作りたい!
                      沢 辰洋
                     @sawat1203



12年12月2日日曜日                             1
自己紹介
       • アイティメディア株式会社勤務
       • Twitter ID : @sawat1203


       • 作ったアプリ

              仕事               個人
12年12月2日日曜日                         2
自己紹介
       • iOSアプリ開発 ONETOPI




               宣伝
     http://1topi.jp
12年12月2日日曜日                   3
今日の話

              1. UICollectionViewって何?

              2. UICollectionViewLayoutって何?

              3. UICollectionViewLayoutでカバーフローを
                作りたい!



12年12月2日日曜日                                       4
今日のサンプルコード


              https://github.com/sawat/
              YidevCollectionViewLayoutSa
              mple


12年12月2日日曜日                                 5
UICollectionView
                 って何?


12年12月2日日曜日                      6
UICollectionViewとは
              • iOS 6で追加された新しいUIKitのクラス
              • UITableViewの思想を継承した設計
              • 自由なセルサイズ&縦横、両方のスク
               ロールをサポート

              • Cellのレイアウト処理が差し替え可能!
12年12月2日日曜日                               7
例




12年12月2日日曜日       8
公式情報
              • WWDC 2012
               • “Introducing Collection View”
               • “Advanced Collection Views and Building
                  Custom Layouts”
              • Collection View Programming Guide for iOS
               • http://developer.apple.com/library/ios/
                  documentation/WindowsViews/


12年12月2日日曜日                                                 9
UICollectionViewLayout
                って何?


12年12月2日日曜日                       10
UICollectionViewLayout
                           とは
              •   UICollectionViewに含まれるの各セルの配置処
                  理を提供するクラス

                  •   UICollectionViewLayoutのサブクラスを実装
                      して任意のレイアウトを実現可能

                  •   UICollectionViewやCell, DataSourceの実装と
                      完全に独立して定義できる → 再利用可能

                  •   GoFのデザパタでいうStrategyパターン

12年12月2日日曜日                                                   11
UICollectionViewLayout
                           とは
              •   デフォルトではUICollectionViewFlowLayoutが
                  使用される

                   •   縦・横両方のスクロールを選択可能

                   •   セル間の   間などを細かく指定できる

                   •   不   いのセルサイズも可能

              •   ぶっちゃけ、ほとんどの場合はFlowLayoutだけ
                  で十分

12年12月2日日曜日                                            12
独自レイアウトの実装が
                       必要になるケース
         Collection View Programming Guide for iOS
         P.38 Creating Custom Layouts

         The only times to consider implementing a custom layout are in the
         following situations:

          •The layout you want looks nothing like a grid or a line-based
              breaking layout.

          •You want to change all of the cell positions frequently enough that
              it would be more work to modify the existing flow layout.




12年12月2日日曜日                                                                      13
独自レイアウトの実装が
                       必要になるケース
         Collection View Programming Guide for iOS
                                  グリッド、または行ベース
         P.38 Creating Custom Layouts
                                          ではないレイアウト
         The only times to consider implementing a custom layout are in the
         following situations:

          •The layout you want looks nothing like a grid or a line-based
              breaking layout.

          •You want to change all of the cell positions frequently enough that
              it would be more work to modify the existing flow layout.




12年12月2日日曜日                                                                      14
独自レイアウトの実装が
                       必要になるケース
         Collection View Programming Guide for iOS
         P.38 Creating Custom Layouts

         The only times to consider implementing a custom layout are in the
                                     すべてのセルの配置が頻繁
         following situations:
                                                 に変わる
          •The layout you want looks nothing like a grid or a line-based
              breaking layout.

          •You want to change all of the cell positions frequently enough that
              it would be more work to modify the existing flow layout.




12年12月2日日曜日                                                                      15
カバーフローをUICollectionViewLayout
                          で実装するメリット

              •   DataSourceやCellと独立しているので、再利用
                  しやすい

              •   他のレイアウトとアニメーション付きで切り
                  替え可能

              •   他の実装方法より簡単!

                  •   他1:UIView/UIScrollViewでごりごり

                  •   他2:UITableViewハック
12年12月2日日曜日                                         16
本題



12年12月2日日曜日        17
UICollectionViewLayout
         でカバーフローを実装
               したい!

12年12月2日日曜日                       18
参考




12年12月2日日曜日        19
では、始めます



12年12月2日日曜日             20
UICollectionViewLayoutを
                 サブクラス化する
       #import <UIKit/UIKit.h>

       @interface CVCLCoverFlowLayout : UICollectionViewLayout

        …

       @end

       #import "CVCLCoverFlowLayout.h"

       @implement CVCLCoverFlowLayout

        …

       @end

12年12月2日日曜日                                                      21
最低限、オバーライドが
                       必要なメソッド
              •   - (CGSize)collectionViewContentSize

              •   - (NSArray *)layoutAttributesForElementsInRect:
                  (CGRect)rect

              •   - (UICollectionViewLayoutAttributes *)
                  layoutAttributesForItemAtIndexPath:  
                  (NSIndexPath *)indexPath

              •   - (BOOL)shouldInvalidateLayoutForBoundsChange:
                  (CGRect)newBounds


12年12月2日日曜日                                                         22
collectionViewContentSize:

              •   Collection Viewがスクロールできる範囲の大き
                  さを返す

              •   UIScrollViewのcontentSizeと同じ

              •   これの戻り値で縦、横のスクロール有無が決
                  まる



12年12月2日日曜日                                       23
collectionViewContentSize:


              •   カバーフローなので、横スクロールにしたい

                  •   セルの数 × セルの配置間隔(pt) を横方向の
                      大きさとする

                  •   縦は、CollectionViewの高さに合わせる




12年12月2日日曜日                                       24
collectionViewContentSize:
                CollectionView




        Cell   Cell      Cell         Cell       Cell        Cell         Cell
                                                                    ...
        0-0    0-1       0-2          0-3        0-4         0-5          0-N



                                 collectionViewContentSize

                  間隔


               width = セル数 × セルの配置間隔

12年12月2日日曜日                                                                      25
collectionViewContentSize:
       @interface CVCLCoverFlowLayout : UICollectionViewLayout
        …
       @property (nonatomic, assign) CGSize cellSize;
       @property (nonatomic, assign) CGFloat cellInterval;


       @implement CVCLCoverFlowLayout
        …
       - (NSInteger)count {
           return [self.collectionView
                               numberOfItemsInSection:0];
       }
       - (CGSize)collectionViewContentSize {
           CGSize size = self.collectionView.bounds.size;
           size.width = self.count * self.cellInterval;
           return size;
       }



12年12月2日日曜日                                                      26
layoutAttributesFor
                        ElementsInRect:
              •   指定されたRectの中に含まれるCell,
                  SupplementaryView, DecorationViewのレイアウ
                  ト情報を返す

                  •   戻り値に含まれないCellなどは表示されない

              •   戻り値は UICollectionViewLayoutAttributes の
                  NSArray


12年12月2日日曜日                                                 27
layoutAttributesFor
                      ElementsInRect:
                   CollectionView




        Cell      Cell      Cell    Cell   Cell   Cell         Cell
                                                         ...
        0-0       0-1       0-2     0-3    0-4    0-5          0-N



                             rect

               Cell 0-0 から Cell 0-5 のlayoutAttributeを
                         NSArrayに入れて返せばよい

12年12月2日日曜日                                                           28
layoutAttributesFor
                     ElementsInRect:
              •   まず、指定されたRectの中に含まれるセルの
                  IndexPathの配列を返すメソッドを実装する
       - (NSArray *)indexPathsForItemsInRect:(CGRect)rect {
           CGFloat cw = self.cellInterval;
           int minRow = MAX(0, (int)floor(rect.origin.x / cw));

              NSMutableArray *array = [NSMutableArray array];
              for (int i=minRow; i < self.count && (i-1) * cw
                          rect.origin.x + rect.size.width; i++) {
                  [array addObject:
                     [NSIndexPath indexPathForItem:i inSection:0]];
              }
              return array;
       }


12年12月2日日曜日                                                           29
layoutAttributesFor
                       ElementsInRect:
              •   さっきのindexPathsForItemsInRect: と
                  layoutAttributesForItemAtIndexPath: を使って実
                  装する
     - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
         NSArray *indices = [self indexPathsForItemsInRect:rect];
         NSMutableArray *array = [NSMutableArray
                               arrayWithCapacity:indices.count];
         for (NSIndexPath *indexPath in indices) {
             [array addObject:[self
                   layoutAttributesForItemAtIndexPath:indexPath]];
         }
         return array;
     }



12年12月2日日曜日                                                          30
layoutAttributesForItem
                        AtIndexPath:
              •   IndexPathで個別に指定されたItemについて、オ
                  ンデマンドにレイアウト情報を返す

                   •   主に表示されるItemの増減に伴って呼び出
                       される

              •   戻り値は UICollectionViewLayoutAttributes のオ
                  ブジェクト


12年12月2日日曜日                                                  31
UICollectionViewLayout
                    Attributesって何?


              •   UICollectionViewの中に表示する各種要素(セ
                  ル、ヘッダーなど)の配置場所を指示するオブ
                  ジェクト




12年12月2日日曜日                                       32
UICollectionViewLayout
                    Attributesって何?
              •   以下の属性を持つ

                   •   frame (centerとsizeでも指定可能)

                   •   alpha

                   •   hidden

                   •   zIndex

                   •   tranceform3D


12年12月2日日曜日                                        33
UICollectionViewLayout
                    Attributesって何?
              •   以下の属性を持つ

                   •   frame (centerとsizeでも指定可能)

                   •   alpha セルに対して、

                   •   CATranceform3Dが指定できる
                       hidden

                   •   zIndex

                   •   tranceform3D
                                              CATransform3DRotate


12年12月2日日曜日                                                         34
layoutAttributesForItem
                    AtIndexPath:
     - (UICollectionViewLayoutAttributes *)
            layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {

          UICollectionViewLayoutAttributes *attr =
            [UICollectionViewLayoutAttributes
               layoutAttributesForCellWithIndexPath:indexPath];

          CGFloat offsetX = indexPath.item * self.cellInterval;

          CGRect frame;
          frame.origin.x = offsetX;
          frame.origin.y = (self.collectionView.bounds.size.height -
                            self.cellSize.height) / 2.0;
          frame.size = self.cellSize;
          attr.frame = frame;

          attr.transform3D = [self transformWithCellOffsetX:offsetX];

          return attr;
     }


12年12月2日日曜日                                                                 35
layoutAttributesForItem
                    AtIndexPath:
     - (UICollectionViewLayoutAttributes *)
            layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath {

          UICollectionViewLayoutAttributes *attr =
            [UICollectionViewLayoutAttributes
               layoutAttributesForCellWithIndexPath:indexPath];

          CGFloat offsetX = indexPath.item * self.cellInterval;
                   セルの位置に合わせて、CATranceform3D
          CGRect frame;
                             でセルの傾きをつける
          frame.origin.x = offsetX;
          frame.origin.y = (self.collectionView.bounds.size.height -
                            self.cellSize.height) / 2.0;
          frame.size = self.cellSize;
          attr.frame = frame;

          attr.transform3D = [self transformWithCellOffsetX:offsetX];

          return attr;
     }


12年12月2日日曜日                                                                 36
つまり




12年12月2日日曜日         37
中央より左のセルは、右向きに回転&中央
       のセルに重ならないように左に移動



12年12月2日日曜日               38
中央のセルは手前に移動




    中央より左のセルは、右向きに回転&中央
       のセルに重ならないように左に移動



12年12月2日日曜日                     39
中央のセルは手前に移動




    中央より左のセルは、右向きに回転&中央   中央より左のセルは、右向きに回転
       のセルに重ならないように左に移動        &右に移動



12年12月2日日曜日                                  40
この辺のあれこれは、




12年12月2日日曜日                41
@fladdict 氏




  https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf



12年12月2日日曜日                                                                                                              42
@fladdict 氏




  https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf



12年12月2日日曜日                                                                                                              43
@fladdict 氏




  https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf



12年12月2日日曜日                                                                                                              44
@fladdict 氏




  https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf



12年12月2日日曜日                                                                                                              45
参考にしました m(_ _)m




12年12月2日日曜日                     46
この辺のあれこれは、
                                                                 @h_mori
                                                                 氏




              http://d.hatena.ne.jp/h_mori/20121102/1351826242


12年12月2日日曜日                                                                47
- (CATransform3D)transformWithCellOffsetX:(CGFloat)cellOffsetX {
         static const CGFloat zDistance = 800.0f;

          // 「中央からセルまでの距離」を相対値で計算する
          CGFloat rate = [self rateFowCellOffsetX:cellOffsetX];

          CATransform3D t = CATransform3DIdentity;
          //視点の距離
          t.m34 = 1.0f / -zDistance;

              //位置(中央のセルを手前、それ以外のセルを左右にずらす)
          t = CATransform3DTranslate(t,
                [self translateXForDistanceRate:rate],
                0.0f,
                [self translateZForDistanceRate:rate]);

          //角度 ( Y軸に対して回転させる)
          t = CATransform3DRotate(t,
                [self angleForDistanceRate:rate],
                0.0f, 1.0f, 0.0f);

          return t;
     }



12年12月2日日曜日                                                             48
セルの位置を -1.0 ∼ 1.0 の指数に変換
     - (CGFloat)rateFowCellOffsetX:(CGFloat)cellOffsetX {
         CGFloat bw = self.collectionView.bounds.size.width;
         CGFloat offsetFromCenter = cellOffsetX +
           self.cellSize.width/2 -
           (self.collectionView.contentOffset.x + bw /2);
         CGFloat rate = offsetFromCenter / bw;
         return MIN(MAX(-1.0, rate), 1.0);
     }



                セルの位置の指数を回転の角度に変換
     - (CGFloat)angleForDistanceRate:(CGFloat)rate {
         static const CGFloat baseAngle = - M_PI * 80 / 180;

              if (fabsf(rate) > _centerRateThreshold) {
                  return copysignf(1.0f, rate) * baseAngle;
              }
              return (rate /_centerRateThreshold) * baseAngle;
     }


12年12月2日日曜日                                                      49
セルの位置の指数をX, Zの移動量に変換
     - (CGFloat)translateXForDistanceRate:(CGFloat)rate {

              if (fabsf(rate) < _centerRateThreshold) {
                  return (rate / _centerRateThreshold) *
                          self.cellSize.width / 2;
              }
              return copysignf(1.0, rate) * self.cellSize.width / 2;
     }

     - (CGFloat)translateZForDistanceRate:(CGFloat)rate {

              if (fabsf(rate) < _centerRateThreshold) {
                  return -1.0 - 2.0 * self.cellSize.width *
                   (1.0 - cos((rate / _centerRateThreshold) * M_PI_2));
              }
              return -1.0 - 2.0 * self.cellSize.width;
     }

              (スケールの代わりにZ軸の移動を使ってます)

12年12月2日日曜日                                                               50
shouldInvalidateLayoutFor
                   BoundsChange:
              •   Collection Viewがスクロールする度に呼び出さ
                  れる。

              •   YES を返すと、
                  layoutAttributesForElementsInRect: が呼び出され
                  レイアウトが更新される

              •   デフォルトは常にNO


12年12月2日日曜日                                                   51
shouldInvalidateLayoutFor
                   BoundsChange:
              •   どんなときに YESを返せばいいの?

                  •   スクロール位置によって、表示済みの要素の
                      位置や変形が動的に変化する

                      •   カバーフローではスクロール位置によって
                          セルの傾きを変えるので常にYESを返す

                  •   UITableView (Plain Style) のようにスクロール
                      端に張り付くヘッダーを表示したい時

12年12月2日日曜日                                                 52
shouldInvalidateLayoutFor
                    BoundsChange:

     - (BOOL)shouldInvalidateLayoutForBoundsChange:
               (CGRect)newBounds {

              return YES;
     }




12年12月2日日曜日                                           53
prepareLayout

     - (void)prepareLayout {
         [super prepareLayout];
         // セルの中央判定用しきい値を設定する
              _centerRateThreshold = _cellInterval /
                 self.collectionView.bounds.size.width;
     }




12年12月2日日曜日                                               54
以上で、最低限のシ
              ンプル実装CoverFlow
                  が完成

12年12月2日日曜日                    55
Demo



12年12月2日日曜日          56
シンプルすぎるよね

         •    端のセルが中央に表示できない

         •    複数セクションにしたい

         •    ヘッダーやフッターも表示したい

         •    セルの追加や削除は?

         •    カバーフローなら反射の映り込みもないと…



12年12月2日日曜日                          57
シンプルすぎるよね  スクロールの前後に余白をつけて調整すればOK




                        複数セクションの合計セル数を元にcontentSizeを計算

         •    端のセルが中央に表示できない
                     layoutAttributesForSupplementaryViewOfKind: atIndexPath:を実装し、
         •    複数セクションにしたい の戻り値にもそれらを含めれば OK
                layoutAttributesForElementsInRect:


         •           実はそのままでそれなりに動くのでOK。
              ヘッダーやフッターも表示したい
                               必要に応じて、prepareForCollectionViewUpdates,

         •             initialLayoutAttributesForAppearingItemAtIndexPath: ,
              セルの追加や削除は?
                  finalLayoutAttributesForDisappearingItemAtIndexPath: 等を実装


         •    カバーフローなら反射の映り込みもないと…
                     デコレーションビューを使って実現可能。
                        layoutAttributesForDecorationViewOfKind:atIndexPath: を実装し、
                      layoutAttributesForElementsInRect: の戻り値にもそれらを含めれば OK

12年12月2日日曜日                                                                          58
CVCLCoverFlowLayout
                       完成版




              •   https://github.com/sawat/CVCLCustomLayouts

12年12月2日日曜日                                                    59
Demo



12年12月2日日曜日          60
残念なお知らせ…

              •   現在のUICollectionViewの実装にバグがあるようで、デ
                  コレーションビューが再利用されず、メモリリークが発
                  生します...。

                   •   さっきのデモの鏡像の部分です…。

                   •   参考) http://qa.atmarkit.co.jp/q/2558

              •   なので、デコレーションビューを本格的に使用するの
                  はしばらく待った方が良さそうです。。。



12年12月2日日曜日                                                  61
ご清聴
              ありがとうございました



12年12月2日日曜日                 62

More Related Content

What's hot

他山の石勉強会 DRBD編
他山の石勉強会 DRBD編他山の石勉強会 DRBD編
他山の石勉強会 DRBD編tkomachi
 
HA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティスHA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティスEnterpriseDB
 
ストレージネットワーク基礎講座
ストレージネットワーク基礎講座ストレージネットワーク基礎講座
ストレージネットワーク基礎講座Brocade
 
Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷
Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷
Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷Yasuyuki Sugitani
 
Fantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウFantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウ虎の穴 開発室
 
WebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis Tool
WebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis ToolWebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis Tool
WebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis ToolJeffrey West
 
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...Shinji Takao
 
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】WESEEKWESEEK
 
FCスイッチISL 追加削除時の考慮点
FCスイッチISL 追加削除時の考慮点FCスイッチISL 追加削除時の考慮点
FCスイッチISL 追加削除時の考慮点Brocade
 
フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。Yutaka Horikawa
 
“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~
“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~
“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~Brocade
 
アジャイル開発のためのDatadog
アジャイル開発のためのDatadogアジャイル開発のためのDatadog
アジャイル開発のためのDatadogNobuyasu Seki
 
OSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなし
OSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなしOSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなし
OSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなしSatoshi Shimazaki
 
Programmazione Funzionale per tutti
Programmazione Funzionale per tuttiProgrammazione Funzionale per tutti
Programmazione Funzionale per tuttiSalvatore Sorrentino
 
スケジュール管理・ガントチャートの作成について
スケジュール管理・ガントチャートの作成についてスケジュール管理・ガントチャートの作成について
スケジュール管理・ガントチャートの作成についてagileware_jp
 
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Go Maeda
 

What's hot (20)

他山の石勉強会 DRBD編
他山の石勉強会 DRBD編他山の石勉強会 DRBD編
他山の石勉強会 DRBD編
 
HA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティスHA環境構築のベスト・プラクティス
HA環境構築のベスト・プラクティス
 
ストレージネットワーク基礎講座
ストレージネットワーク基礎講座ストレージネットワーク基礎講座
ストレージネットワーク基礎講座
 
Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷
Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷
Scalaに至るまでの物語 - Septeni × Scala 第一回 杉谷
 
Fantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウFantiaから学ぶgcp運用のノウハウ
Fantiaから学ぶgcp運用のノウハウ
 
WebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis Tool
WebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis ToolWebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis Tool
WebLogic's ClassLoaders, Filtering ClassLoader and ClassLoader Analysis Tool
 
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
GraalVMのJavaネイティブビルド機能でどの程度起動が速くなるのか?~サーバレス基盤上での評価~ / How fast does GraalVM's...
 
TeamFileご提案資料
TeamFileご提案資料TeamFileご提案資料
TeamFileご提案資料
 
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
Stripeを使った簡単なサブスク型課金サービスの作り方【WESEEK Tech Conf #15】
 
FCスイッチISL 追加削除時の考慮点
FCスイッチISL 追加削除時の考慮点FCスイッチISL 追加削除時の考慮点
FCスイッチISL 追加削除時の考慮点
 
フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。フロントエンドの技術を刷新した話し。
フロントエンドの技術を刷新した話し。
 
B1-5 メール技術のいま
B1-5 メール技術のいまB1-5 メール技術のいま
B1-5 メール技術のいま
 
“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~
“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~
“見てわかる” ファイバーチャネルSAN基礎講座(第5弾)~さあ、いよいよ、運用です!~
 
アジャイル開発のためのDatadog
アジャイル開発のためのDatadogアジャイル開発のためのDatadog
アジャイル開発のためのDatadog
 
OSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなし
OSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなしOSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなし
OSC2012Kansai@Kyoto 自宅SAN友の会 - インフラエンジニアなら知っておきたい ストレージのはなし
 
Rar
RarRar
Rar
 
Programmazione Funzionale per tutti
Programmazione Funzionale per tuttiProgrammazione Funzionale per tutti
Programmazione Funzionale per tutti
 
スケジュール管理・ガントチャートの作成について
スケジュール管理・ガントチャートの作成についてスケジュール管理・ガントチャートの作成について
スケジュール管理・ガントチャートの作成について
 
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)Redmineの意外と知らない便利機能(Redmine 4.2対応版)
Redmineの意外と知らない便利機能(Redmine 4.2対応版)
 
Db2 V11 GUIツール
Db2 V11 GUIツールDb2 V11 GUIツール
Db2 V11 GUIツール
 

Viewers also liked

Uicollectionview
UicollectionviewUicollectionview
Uicollectionviewtowaki777
 
UITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作るUITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作るHidetoshi Mori
 
初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話
初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話
初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話賢治 田中
 
UITableView Training Presentation Slides
UITableView Training Presentation SlidesUITableView Training Presentation Slides
UITableView Training Presentation SlidesgrateDvyde
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説Fumiya Sakai
 
4年前のカメラアプリをSwiftで書きなおした
4年前のカメラアプリをSwiftで書きなおした4年前のカメラアプリをSwiftで書きなおした
4年前のカメラアプリをSwiftで書きなおしたHiromichi Yamada
 
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」Tomoaki Shimizu
 
【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!Yu Tanaka
 
SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。
SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。
SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。Daisuke Koshimizu
 

Viewers also liked (9)

Uicollectionview
UicollectionviewUicollectionview
Uicollectionview
 
UITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作るUITableViewで無限CoverFlowを作る
UITableViewで無限CoverFlowを作る
 
初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話
初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話
初めての自作ライブラリを
案件に導入して
脳汁ブシャーした話
 
UITableView Training Presentation Slides
UITableView Training Presentation SlidesUITableView Training Presentation Slides
UITableView Training Presentation Slides
 
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
指の動きや遷移時等のアニメーションを生かしたUIのサンプル解説
 
4年前のカメラアプリをSwiftで書きなおした
4年前のカメラアプリをSwiftで書きなおした4年前のカメラアプリをSwiftで書きなおした
4年前のカメラアプリをSwiftで書きなおした
 
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
Cocos2d-x(JS) ハンズオン #07「新エディタ Cocos Creator v1.0」
 
【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!【Swift】 それ、enumとstructでやってみましょう!!
【Swift】 それ、enumとstructでやってみましょう!!
 
SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。
SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。
SVGの基本&活用法。SVGのメリットと事例を基礎から学ぶ。
 

Similar to UICollectionViewLayoutでカバーフローを作りたい!

2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料OCHI Shuji
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで増田 亨
 
「その他」のUI Framework 3選
「その他」のUI Framework 3選「その他」のUI Framework 3選
「その他」のUI Framework 3選Shumpei Shiraishi
 
はじめての Azure 開発
はじめての Azure 開発はじめての Azure 開発
はじめての Azure 開発Yoshitaka Seo
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介Fumiya Sakai
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話terurou
 
5分でわかる?Backbone.js ことはじめ
5分でわかる?Backbone.js ことはじめ5分でわかる?Backbone.js ことはじめ
5分でわかる?Backbone.js ことはじめKohei Kadowaki
 
iOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPracticeiOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPracticeKen Morishita
 
Sugarcubeをはじめよう
SugarcubeをはじめようSugarcubeをはじめよう
SugarcubeをはじめようEihiro Saishu
 
flasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみてflasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみて佐藤 俊太郎
 
Reactnative はじめの一歩
Reactnative はじめの一歩Reactnative はじめの一歩
Reactnative はじめの一歩PIXTA Inc.
 
Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技Masahito Zembutsu
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介NilOne Ltd.
 
Head First XML Layout on Android
Head First XML Layout on AndroidHead First XML Layout on Android
Head First XML Layout on AndroidYuki Anzai
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshopDaisuke Sugai
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソYoshitaka Seo
 
LightSwitch で遊んでみた Rev. 2
LightSwitch で遊んでみた Rev. 2LightSwitch で遊んでみた Rev. 2
LightSwitch で遊んでみた Rev. 2Yoshitaka Seo
 
2012年8月10日 勉強会
2012年8月10日 勉強会2012年8月10日 勉強会
2012年8月10日 勉強会Rin Yano
 

Similar to UICollectionViewLayoutでカバーフローを作りたい! (20)

2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料2012 05-19第44回cocoa勉強会発表資料
2012 05-19第44回cocoa勉強会発表資料
 
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装までドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
 
「その他」のUI Framework 3選
「その他」のUI Framework 3選「その他」のUI Framework 3選
「その他」のUI Framework 3選
 
はじめての Azure 開発
はじめての Azure 開発はじめての Azure 開発
はじめての Azure 開発
 
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
RxDataSourceをNSDiffableDataSourceへ置き換える際のTips集紹介
 
大規模なJavaScript開発の話
大規模なJavaScript開発の話大規模なJavaScript開発の話
大規模なJavaScript開発の話
 
5分でわかる?Backbone.js ことはじめ
5分でわかる?Backbone.js ことはじめ5分でわかる?Backbone.js ことはじめ
5分でわかる?Backbone.js ことはじめ
 
テスト
テストテスト
テスト
 
iOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPracticeiOSやAndroidアプリ開発のGoodPractice
iOSやAndroidアプリ開発のGoodPractice
 
Sugarcubeをはじめよう
SugarcubeをはじめようSugarcubeをはじめよう
Sugarcubeをはじめよう
 
flasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみてflasherがはじめてiOS開発をしてみて
flasherがはじめてiOS開発をしてみて
 
Reactnative はじめの一歩
Reactnative はじめの一歩Reactnative はじめの一歩
Reactnative はじめの一歩
 
Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技Docker 9 tips~意外と知られていない日常で役立つ便利技
Docker 9 tips~意外と知られていない日常で役立つ便利技
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
 
Head First XML Layout on Android
Head First XML Layout on AndroidHead First XML Layout on Android
Head First XML Layout on Android
 
Intalio japan special cloud workshop
Intalio japan special cloud workshopIntalio japan special cloud workshop
Intalio japan special cloud workshop
 
Asp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソAsp Net Mvc 基礎のキソ
Asp Net Mvc 基礎のキソ
 
LightSwitch で遊んでみた Rev. 2
LightSwitch で遊んでみた Rev. 2LightSwitch で遊んでみた Rev. 2
LightSwitch で遊んでみた Rev. 2
 
2012年8月10日 勉強会
2012年8月10日 勉強会2012年8月10日 勉強会
2012年8月10日 勉強会
 
vImageのススメ
vImageのススメvImageのススメ
vImageのススメ
 

Recently uploaded

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A surveyToru Tamaki
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...Toru Tamaki
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものですiPride Co., Ltd.
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNetToru Tamaki
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Yuma Ohgami
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdftaisei2219
 

Recently uploaded (9)

[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 
論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey論文紹介:Semantic segmentation using Vision Transformers: A survey
論文紹介:Semantic segmentation using Vision Transformers: A survey
 
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
論文紹介:Content-Aware Token Sharing for Efficient Semantic Segmentation With Vis...
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
SOPを理解する 2024/04/19 の勉強会で発表されたものです
SOPを理解する       2024/04/19 の勉強会で発表されたものですSOPを理解する       2024/04/19 の勉強会で発表されたものです
SOPを理解する 2024/04/19 の勉強会で発表されたものです
 
論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet論文紹介:Automated Classification of Model Errors on ImageNet
論文紹介:Automated Classification of Model Errors on ImageNet
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
Open Source UN-Conference 2024 Kawagoe - 独自OS「DaisyOS GB」の紹介
 
TSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdfTSAL operation mechanism and circuit diagram.pdf
TSAL operation mechanism and circuit diagram.pdf
 

UICollectionViewLayoutでカバーフローを作りたい!

  • 1. UICollectionViewLayoutで カバフローを作りたい! 沢 辰洋 @sawat1203 12年12月2日日曜日 1
  • 2. 自己紹介 • アイティメディア株式会社勤務 • Twitter ID : @sawat1203 • 作ったアプリ 仕事 個人 12年12月2日日曜日 2
  • 3. 自己紹介 • iOSアプリ開発 ONETOPI 宣伝 http://1topi.jp 12年12月2日日曜日 3
  • 4. 今日の話 1. UICollectionViewって何? 2. UICollectionViewLayoutって何? 3. UICollectionViewLayoutでカバーフローを 作りたい! 12年12月2日日曜日 4
  • 5. 今日のサンプルコード https://github.com/sawat/ YidevCollectionViewLayoutSa mple 12年12月2日日曜日 5
  • 6. UICollectionView って何? 12年12月2日日曜日 6
  • 7. UICollectionViewとは • iOS 6で追加された新しいUIKitのクラス • UITableViewの思想を継承した設計 • 自由なセルサイズ&縦横、両方のスク ロールをサポート • Cellのレイアウト処理が差し替え可能! 12年12月2日日曜日 7
  • 9. 公式情報 • WWDC 2012 • “Introducing Collection View” • “Advanced Collection Views and Building Custom Layouts” • Collection View Programming Guide for iOS • http://developer.apple.com/library/ios/ documentation/WindowsViews/ 12年12月2日日曜日 9
  • 10. UICollectionViewLayout って何? 12年12月2日日曜日 10
  • 11. UICollectionViewLayout とは • UICollectionViewに含まれるの各セルの配置処 理を提供するクラス • UICollectionViewLayoutのサブクラスを実装 して任意のレイアウトを実現可能 • UICollectionViewやCell, DataSourceの実装と 完全に独立して定義できる → 再利用可能 • GoFのデザパタでいうStrategyパターン 12年12月2日日曜日 11
  • 12. UICollectionViewLayout とは • デフォルトではUICollectionViewFlowLayoutが 使用される • 縦・横両方のスクロールを選択可能 • セル間の 間などを細かく指定できる • 不 いのセルサイズも可能 • ぶっちゃけ、ほとんどの場合はFlowLayoutだけ で十分 12年12月2日日曜日 12
  • 13. 独自レイアウトの実装が 必要になるケース Collection View Programming Guide for iOS P.38 Creating Custom Layouts The only times to consider implementing a custom layout are in the following situations: •The layout you want looks nothing like a grid or a line-based breaking layout. •You want to change all of the cell positions frequently enough that it would be more work to modify the existing flow layout. 12年12月2日日曜日 13
  • 14. 独自レイアウトの実装が 必要になるケース Collection View Programming Guide for iOS グリッド、または行ベース P.38 Creating Custom Layouts ではないレイアウト The only times to consider implementing a custom layout are in the following situations: •The layout you want looks nothing like a grid or a line-based breaking layout. •You want to change all of the cell positions frequently enough that it would be more work to modify the existing flow layout. 12年12月2日日曜日 14
  • 15. 独自レイアウトの実装が 必要になるケース Collection View Programming Guide for iOS P.38 Creating Custom Layouts The only times to consider implementing a custom layout are in the すべてのセルの配置が頻繁 following situations: に変わる •The layout you want looks nothing like a grid or a line-based breaking layout. •You want to change all of the cell positions frequently enough that it would be more work to modify the existing flow layout. 12年12月2日日曜日 15
  • 16. カバーフローをUICollectionViewLayout で実装するメリット • DataSourceやCellと独立しているので、再利用 しやすい • 他のレイアウトとアニメーション付きで切り 替え可能 • 他の実装方法より簡単! • 他1:UIView/UIScrollViewでごりごり • 他2:UITableViewハック 12年12月2日日曜日 16
  • 18. UICollectionViewLayout でカバーフローを実装 したい! 12年12月2日日曜日 18
  • 21. UICollectionViewLayoutを サブクラス化する #import <UIKit/UIKit.h> @interface CVCLCoverFlowLayout : UICollectionViewLayout  … @end #import "CVCLCoverFlowLayout.h" @implement CVCLCoverFlowLayout  … @end 12年12月2日日曜日 21
  • 22. 最低限、オバーライドが 必要なメソッド • - (CGSize)collectionViewContentSize • - (NSArray *)layoutAttributesForElementsInRect: (CGRect)rect • - (UICollectionViewLayoutAttributes *) layoutAttributesForItemAtIndexPath:   (NSIndexPath *)indexPath • - (BOOL)shouldInvalidateLayoutForBoundsChange: (CGRect)newBounds 12年12月2日日曜日 22
  • 23. collectionViewContentSize: • Collection Viewがスクロールできる範囲の大き さを返す • UIScrollViewのcontentSizeと同じ • これの戻り値で縦、横のスクロール有無が決 まる 12年12月2日日曜日 23
  • 24. collectionViewContentSize: • カバーフローなので、横スクロールにしたい • セルの数 × セルの配置間隔(pt) を横方向の 大きさとする • 縦は、CollectionViewの高さに合わせる 12年12月2日日曜日 24
  • 25. collectionViewContentSize: CollectionView Cell Cell Cell Cell Cell Cell Cell ... 0-0 0-1 0-2 0-3 0-4 0-5 0-N collectionViewContentSize 間隔 width = セル数 × セルの配置間隔 12年12月2日日曜日 25
  • 26. collectionViewContentSize: @interface CVCLCoverFlowLayout : UICollectionViewLayout  … @property (nonatomic, assign) CGSize cellSize; @property (nonatomic, assign) CGFloat cellInterval; @implement CVCLCoverFlowLayout  … - (NSInteger)count { return [self.collectionView numberOfItemsInSection:0]; } - (CGSize)collectionViewContentSize { CGSize size = self.collectionView.bounds.size; size.width = self.count * self.cellInterval; return size; } 12年12月2日日曜日 26
  • 27. layoutAttributesFor ElementsInRect: • 指定されたRectの中に含まれるCell, SupplementaryView, DecorationViewのレイアウ ト情報を返す • 戻り値に含まれないCellなどは表示されない • 戻り値は UICollectionViewLayoutAttributes の NSArray 12年12月2日日曜日 27
  • 28. layoutAttributesFor ElementsInRect: CollectionView Cell Cell Cell Cell Cell Cell Cell ... 0-0 0-1 0-2 0-3 0-4 0-5 0-N rect Cell 0-0 から Cell 0-5 のlayoutAttributeを NSArrayに入れて返せばよい 12年12月2日日曜日 28
  • 29. layoutAttributesFor ElementsInRect: • まず、指定されたRectの中に含まれるセルの IndexPathの配列を返すメソッドを実装する - (NSArray *)indexPathsForItemsInRect:(CGRect)rect { CGFloat cw = self.cellInterval; int minRow = MAX(0, (int)floor(rect.origin.x / cw)); NSMutableArray *array = [NSMutableArray array]; for (int i=minRow; i < self.count && (i-1) * cw rect.origin.x + rect.size.width; i++) { [array addObject: [NSIndexPath indexPathForItem:i inSection:0]]; } return array; } 12年12月2日日曜日 29
  • 30. layoutAttributesFor ElementsInRect: • さっきのindexPathsForItemsInRect: と layoutAttributesForItemAtIndexPath: を使って実 装する - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect { NSArray *indices = [self indexPathsForItemsInRect:rect]; NSMutableArray *array = [NSMutableArray arrayWithCapacity:indices.count]; for (NSIndexPath *indexPath in indices) { [array addObject:[self layoutAttributesForItemAtIndexPath:indexPath]]; } return array; } 12年12月2日日曜日 30
  • 31. layoutAttributesForItem AtIndexPath: • IndexPathで個別に指定されたItemについて、オ ンデマンドにレイアウト情報を返す • 主に表示されるItemの増減に伴って呼び出 される • 戻り値は UICollectionViewLayoutAttributes のオ ブジェクト 12年12月2日日曜日 31
  • 32. UICollectionViewLayout Attributesって何? • UICollectionViewの中に表示する各種要素(セ ル、ヘッダーなど)の配置場所を指示するオブ ジェクト 12年12月2日日曜日 32
  • 33. UICollectionViewLayout Attributesって何? • 以下の属性を持つ • frame (centerとsizeでも指定可能) • alpha • hidden • zIndex • tranceform3D 12年12月2日日曜日 33
  • 34. UICollectionViewLayout Attributesって何? • 以下の属性を持つ • frame (centerとsizeでも指定可能) • alpha セルに対して、 • CATranceform3Dが指定できる hidden • zIndex • tranceform3D CATransform3DRotate 12年12月2日日曜日 34
  • 35. layoutAttributesForItem AtIndexPath: - (UICollectionViewLayoutAttributes *) layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; CGFloat offsetX = indexPath.item * self.cellInterval; CGRect frame; frame.origin.x = offsetX; frame.origin.y = (self.collectionView.bounds.size.height - self.cellSize.height) / 2.0; frame.size = self.cellSize; attr.frame = frame; attr.transform3D = [self transformWithCellOffsetX:offsetX]; return attr; } 12年12月2日日曜日 35
  • 36. layoutAttributesForItem AtIndexPath: - (UICollectionViewLayoutAttributes *) layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewLayoutAttributes *attr = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; CGFloat offsetX = indexPath.item * self.cellInterval; セルの位置に合わせて、CATranceform3D CGRect frame; でセルの傾きをつける frame.origin.x = offsetX; frame.origin.y = (self.collectionView.bounds.size.height - self.cellSize.height) / 2.0; frame.size = self.cellSize; attr.frame = frame; attr.transform3D = [self transformWithCellOffsetX:offsetX]; return attr; } 12年12月2日日曜日 36
  • 38. 中央より左のセルは、右向きに回転&中央 のセルに重ならないように左に移動 12年12月2日日曜日 38
  • 39. 中央のセルは手前に移動 中央より左のセルは、右向きに回転&中央 のセルに重ならないように左に移動 12年12月2日日曜日 39
  • 40. 中央のセルは手前に移動 中央より左のセルは、右向きに回転&中央 中央より左のセルは、右向きに回転 のセルに重ならないように左に移動 &右に移動 12年12月2日日曜日 40
  • 42. @fladdict 氏 https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf 12年12月2日日曜日 42
  • 43. @fladdict 氏 https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf 12年12月2日日曜日 43
  • 44. @fladdict 氏 https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf 12年12月2日日曜日 44
  • 45. @fladdict 氏 https://s3-ap-northeast-1.amazonaws.com/slidrs.t1/1338005297280_5734dda2c903f5b359b209804920c189/UITableViewHack.pdf 12年12月2日日曜日 45
  • 47. この辺のあれこれは、 @h_mori 氏 http://d.hatena.ne.jp/h_mori/20121102/1351826242 12年12月2日日曜日 47
  • 48. - (CATransform3D)transformWithCellOffsetX:(CGFloat)cellOffsetX { static const CGFloat zDistance = 800.0f; // 「中央からセルまでの距離」を相対値で計算する CGFloat rate = [self rateFowCellOffsetX:cellOffsetX]; CATransform3D t = CATransform3DIdentity; //視点の距離 t.m34 = 1.0f / -zDistance; //位置(中央のセルを手前、それ以外のセルを左右にずらす) t = CATransform3DTranslate(t, [self translateXForDistanceRate:rate], 0.0f, [self translateZForDistanceRate:rate]); //角度 ( Y軸に対して回転させる) t = CATransform3DRotate(t, [self angleForDistanceRate:rate], 0.0f, 1.0f, 0.0f); return t; } 12年12月2日日曜日 48
  • 49. セルの位置を -1.0 ∼ 1.0 の指数に変換 - (CGFloat)rateFowCellOffsetX:(CGFloat)cellOffsetX { CGFloat bw = self.collectionView.bounds.size.width; CGFloat offsetFromCenter = cellOffsetX + self.cellSize.width/2 - (self.collectionView.contentOffset.x + bw /2); CGFloat rate = offsetFromCenter / bw; return MIN(MAX(-1.0, rate), 1.0); } セルの位置の指数を回転の角度に変換 - (CGFloat)angleForDistanceRate:(CGFloat)rate { static const CGFloat baseAngle = - M_PI * 80 / 180; if (fabsf(rate) > _centerRateThreshold) { return copysignf(1.0f, rate) * baseAngle; } return (rate /_centerRateThreshold) * baseAngle; } 12年12月2日日曜日 49
  • 50. セルの位置の指数をX, Zの移動量に変換 - (CGFloat)translateXForDistanceRate:(CGFloat)rate { if (fabsf(rate) < _centerRateThreshold) { return (rate / _centerRateThreshold) * self.cellSize.width / 2; } return copysignf(1.0, rate) * self.cellSize.width / 2; } - (CGFloat)translateZForDistanceRate:(CGFloat)rate { if (fabsf(rate) < _centerRateThreshold) { return -1.0 - 2.0 * self.cellSize.width * (1.0 - cos((rate / _centerRateThreshold) * M_PI_2)); } return -1.0 - 2.0 * self.cellSize.width; } (スケールの代わりにZ軸の移動を使ってます) 12年12月2日日曜日 50
  • 51. shouldInvalidateLayoutFor BoundsChange: • Collection Viewがスクロールする度に呼び出さ れる。 • YES を返すと、 layoutAttributesForElementsInRect: が呼び出され レイアウトが更新される • デフォルトは常にNO 12年12月2日日曜日 51
  • 52. shouldInvalidateLayoutFor BoundsChange: • どんなときに YESを返せばいいの? • スクロール位置によって、表示済みの要素の 位置や変形が動的に変化する • カバーフローではスクロール位置によって セルの傾きを変えるので常にYESを返す • UITableView (Plain Style) のようにスクロール 端に張り付くヘッダーを表示したい時 12年12月2日日曜日 52
  • 53. shouldInvalidateLayoutFor BoundsChange: - (BOOL)shouldInvalidateLayoutForBoundsChange: (CGRect)newBounds { return YES; } 12年12月2日日曜日 53
  • 54. prepareLayout - (void)prepareLayout { [super prepareLayout]; // セルの中央判定用しきい値を設定する _centerRateThreshold = _cellInterval / self.collectionView.bounds.size.width; } 12年12月2日日曜日 54
  • 55. 以上で、最低限のシ ンプル実装CoverFlow が完成 12年12月2日日曜日 55
  • 57. シンプルすぎるよね • 端のセルが中央に表示できない • 複数セクションにしたい • ヘッダーやフッターも表示したい • セルの追加や削除は? • カバーフローなら反射の映り込みもないと… 12年12月2日日曜日 57
  • 58. シンプルすぎるよね スクロールの前後に余白をつけて調整すればOK 複数セクションの合計セル数を元にcontentSizeを計算 • 端のセルが中央に表示できない layoutAttributesForSupplementaryViewOfKind: atIndexPath:を実装し、 • 複数セクションにしたい の戻り値にもそれらを含めれば OK layoutAttributesForElementsInRect: • 実はそのままでそれなりに動くのでOK。 ヘッダーやフッターも表示したい 必要に応じて、prepareForCollectionViewUpdates, • initialLayoutAttributesForAppearingItemAtIndexPath: , セルの追加や削除は? finalLayoutAttributesForDisappearingItemAtIndexPath: 等を実装 • カバーフローなら反射の映り込みもないと… デコレーションビューを使って実現可能。 layoutAttributesForDecorationViewOfKind:atIndexPath: を実装し、 layoutAttributesForElementsInRect: の戻り値にもそれらを含めれば OK 12年12月2日日曜日 58
  • 59. CVCLCoverFlowLayout 完成版 • https://github.com/sawat/CVCLCustomLayouts 12年12月2日日曜日 59
  • 61. 残念なお知らせ… • 現在のUICollectionViewの実装にバグがあるようで、デ コレーションビューが再利用されず、メモリリークが発 生します...。 • さっきのデモの鏡像の部分です…。 • 参考) http://qa.atmarkit.co.jp/q/2558 • なので、デコレーションビューを本格的に使用するの はしばらく待った方が良さそうです。。。 12年12月2日日曜日 61
  • 62. ご清聴 ありがとうございました 12年12月2日日曜日 62