1

iOSと同じカレンダービューを作成しようとしていますが、これは4年間です。添付UICollectionViewCellのUICollectionView遅い/遅いスクロール

The hierarchy is like: UICollectionView: One Section for each year UICollectionViewCell: 12 cells/items for 12 months in an year UICollectionView: UICollectionViewCell: Upto 31 cells for month day string, which have UILabel as their content.

スクリーンショット。ラグスクロールを乗り越えるためには

enter image description here

、私は月・セルのデータソースを削除しました。コンテナビューコントローラ自体は、両方のコレクションビューのデータソースです。

12か年コレクションビューは、年値のインデックスパスを格納するためにサブクラス化されています。 https://ashfurrow.com/blog/putting-a-uicollectionview-in-a-uitableviewcell/

しかし、それを表示する前に月のセルでreloadDataを呼び出していたときに問題が残っていました。

これを解決するには、UICollectionViewCellのprepareForReuse()メソッドをオーバーライドし、monthCollectionViewCellのindexPath、delegateおよびdatasourceプロパティをnilに設定しました。また、reloadData呼び出しを削除しました。しかし、スクロールはまだ遅いです。

チュートリアルのリンクは私のワークフローとほぼ同じです。 https://github.com/nipun0505/TestCalendarView

+0

私は毎月独自の「UICollectionView」を作成しないことを真剣に検討します。あまりにも多くのビューをネストしています。代わりに、12個のセルを持つ単一の 'UICollectionView'を用意し、テキスト自体を描画し、独自のヒットテストを行うカスタム' UIView'サブクラスを構築します。 –

+0

代わりに複数のCATExtLayersを使用しますか? – Nil

+0

['drawRect:'](https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/index.html#//apple_ref/occ/instm/UIView/drawRect :)をオーバーライドします。 NSString' [描画メソッド](https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSString_Class/index.html#//apple_ref/occ/instm/NSString)を使用します。/drawAtPoint:withAttributes :) –

答えて

2

あなたがで遅れを減らすことができます:

1)自分の色をキャッシュここ

は私のコードへのリンクです。

は、このコード行をコメントアウトしてみて、遅れがどのようにより良い参照してください。

//  if ([[_dateCompareFormatter stringFromDate:date] isEqualToString:[_dateCompareFormatter stringFromDate:[NSDate date]]]) 
//  { 
//   dayCell.dayLabel.backgroundColor = [UIColor cyanColor]; 
//  } 

//  else 
//  { 
//   dayCell.dayLabel.backgroundColor = [UIColor clearColor]; 
//  } 

あなたの色をキャッシュした後、明確な色は、不透明な色よりも遅れることに注意してください。

2)なぜこの関数で日付フォーマッタを繰り返し作成していますか?

(UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 
NSDateFormatter *df = [[NSDateFormatter alloc] init]; 

このようなものをキャッシュしてください。キャッシングはあなたの友人です。

3)他の領域でもパフォーマンスを向上させることができます。あなたのカレンダーの読み込み時間は恐ろしいです:s。

これをスピードアップして上記の2つのことを行うと、速度が大幅に向上します。

[編集#3] - >あなたのカレンダーの読み込み時間がほぼ4秒であると言っています。これは、画面上に多くのアイテムを表示しているためです。たぶんあなたのデザインを少し変えることができますか?ここに狂ったアイデアがあります。毎月、カレンダーは現在約30項目を追跡する必要があります。これは、iPhone 6sの画面あたり約15ヶ月間、月に約30の項目です。 30項目を追跡する代わりに、MonthCellの行に6つのラベルを並べることができますか?あなたは、テキストを整列させるために何らかの計算を使わなければならないでしょうが、あなたがそれを働かせることができればあなたのパフォーマンスの向上は信じられないでしょう。

私はあなたが青い色のバックビューを持って参照してください参照してください。したがって、2種類の細胞を持つことができます。 1つは6つのラベル、もう1つは30のアイテムです。あなたのニーズに基づいてどのセルを表示することができます。あなたが料理を作ることができる多くのことがあり、パフォーマンスを向上させます。

+0

OK。だから私は汚い割り当てを削除しました。そしてその作業は少し良くなりました。しかし、私は第3のポイントを理解していませんでした。どのように負荷時間を短縮できますか? – Nil

+0

あなたのカレンダーはまだ遅れていますか? –

+0

私は31ラベルのCATextLayerInsteadを使用しました。しかし、それでもパフォーマンスは最高のものではありません。私は別のものを試しています。一度私がそこに着くと解決策を投稿します。 – Nil