问题描述
所以我使用搜索功能和 sectionIndexTitles
实现了一个正确的 TableView
。现在,我正在尝试实现一个 UICollectionView
,它到目前为止工作,除了我不能轻易拥有 sectionIndexTitles
(右侧滚动条)。
So I implemented a proper TableView
with a search functionality and sectionIndexTitles
. Now, I am trying to implement a UICollectionView
and it is working so far, except that I can't easily have sectionIndexTitles
(the right scroll bar).
如果我查看Facebook应用程序,它看起来像 UICollectionView
,但确实 sectionIndexTitles
和一个搜索栏。我似乎无法为 UICollectionView
模型找到这样的函数。
If I look at the Facebook Application, it looks like a UICollectionView
, but with indeed sectionIndexTitles
and a searchbar. I can't seem to find such functions for the UICollectionView
model.
任何想法?!
谢谢!
推荐答案
我有类似的要求(对于水平集合视图)并最终建立了一个索引视图子类我自己。
I had a similar requirement (for a horizontal collection view) and ended up building an index view subclass myself.
我打算开源它,但这可能要等到下个月,所以这里有一个存根来启动你:
I plan to open-source it but that will likely have to wait until next month, so here's a stub to get you started:
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
这篇关于用于UICollectionView的SectionIndexTitles的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!