21

そこでTableView、検索機能とsectionIndexTitles. 今、私は a を実装しようとしてUICollectionViewいますが、これまでのところ機能していますが、簡単に持つことができませんsectionIndexTitles(右のスクロールバー)。

Facebook アプリケーションを見ると、 のように見えますUICollectionViewが、実際sectionIndexTitlesには と 検索バーが付いています。モデルにそのような関数が見つからないようですUICollectionView

何か案は?!

ありがとう!

ここに画像の説明を入力

4

5 に答える 5

16

私は同様の要件 (水平コレクション ビューの場合) を持っていたので、自分でインデックス ビュー サブクラスを構築することになりました。

私はそれをオープンソース化する予定ですが、それは来月まで待たなければならない可能性が高いので、ここにあなたが始めるためのスタブがあります:

YMCollectionIndexView.h

@interface YMCollectionIndexView : UIControl

- (id) initWithFrame:(CGRect)frame indexTitles:(NSArray *)indexTitles;

// Model
@property (strong, nonatomic) NSArray *indexTitles; // NSString
@property (readonly, nonatomic) NSUInteger currentIndex;
- (NSString *)currentIndexTitle;

@end

YMCollectionIndexView.m

#import "YMCollectionIndexView.h"

@interface YMCollectionIndexView ()
@property (readwrite, nonatomic) NSUInteger currentIndex;
@property (strong, nonatomic) NSArray *indexLabels;
@end

@implementation YMCollectionIndexView

- (id) initWithFrame:(CGRect)frame indexTitles:(NSArray *)indexTitles {
    self = [super initWithFrame:frame];
    if (self) {
        self.indexTitles = indexTitles;
        self.currentIndex = 0;
        // add pan recognizer
    }
    return self;
}

- (void)setIndexTitles:(NSArray *)indexTitles {
    if (_indexTitles == indexTitles) return;
    _indexTitles = indexTitles;
    [self.indexLabels makeObjectsPerformSelector:@selector(removeFromSuperview)];
    [self buildIndexLabels];
}

- (NSString *)currentIndexTitle {
    return self.indexTitles[self.currentIndex];
}

#pragma mark - Subviews

- (void) buildIndexLabels {
    CGFloat cumulativeItemWidth = 0.0; // or height in your (vertical) case
    for (NSString *indexTitle in self.indexTitles) {
            // build and add label
        // add tap recognizer
    }
    self.indexLabels = indexLabels;
}

#pragma mark - Gestures

- (void) handleTap:(UITapGestureRecognizer*)recognizer {
    NSString *indexTitle = ((UILabel *)recognizer.view).text;
    self.currentIndex = [self.indexTitles indexOfObject:indexTitle];
    [self sendActionsForControlEvents:UIControlEventTouchUpInside];
}

// similarly for pan recognizer

@end

ビューコントローラーで:

- (void)viewDidLoad {
    [super viewDidLoad];
    [self.collectionIndexView addTarget:self action:@selector(indexWasTapped:) forControlEvents:UIControlEventTouchUpInside];
    // similarly for pan recognizer
}

- (void)indexWasTapped:(id)sender {
    [self.collectionView scrollToIndexPath:...];
}

// similarly for pan recognizer
于 2013-01-21T16:57:36.587 に答える
-1

UICollectionViewDataSourceの次の関数の値を実装して返すことにより、このヘッダーを提供できます。

collectionView:viewForSupplementaryElementOfKind:atIndexPath:

ヘッダーのサイズは、UICollectionViewFlowLayoutDelegateメソッド collectionView:layout:referenceSizeForHeaderInSection:から返される CGRect の高さの値から取得されることに注意してください。

于 2012-12-15T20:08:57.027 に答える