在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:LazyScrollView开源软件地址:https://gitee.com/KelvinZhang/LazyScrollView开源软件介绍:##
在这篇文章中,博主详细介绍了LazyScrollView的使用和实现方案,但是并没有给出具体DEMO,这里只是站在巨人的肩膀上,给一个DEMO,同时也希望可以抛砖引玉。 ## @protocol LazyScrollViewDataSource <NSObject>@required// ScrollView一共展示多少个item- (NSUInteger)numberOfItemInScrollView:(LazyScrollView *)scrollView;// 要求根据index直接返回RectModel- (LSVRectModel *)scrollView:(LazyScrollView *)scrollView rectModelAtIndex:(NSUInteger)index;// 返回下标所对应的view- (UIView *)scrollView:(LazyScrollView *)scrollView itemByLsvId:(NSString *)lsvId;@end 其中 @interface LSVRectModel : NSObject// 转换后的绝对值rect@property (nonatomic, assign) CGRect absRect;// 业务下标@property (nonatomic, copy) NSString *lsvId;+ (instancetype)modelWithRect:(CGRect)rect lsvId:(NSString *)lsvId;@end 三个接口都很简单,和 另外, - (void)reloadData;- (UIView *)dequeueReusableItemWithIdentifier:(NSString *)identifier;- (void)registerClass:(Class)viewClass forViewReuseIdentifier:(NSString *)identifier; ## @property (nonatomic, strong) NSMutableDictionary<NSString *, NSMutableSet *> *reuseViews;@property (nonatomic, strong) NSMutableSet<__kindof UIView *> *visibleViews; 由于每个
这里作者用的是 而当一个View滑到可见区域内时,需要先从 最后一个问题就是如何判断一个
好了,说了这么多,先放出DEMO地址吧,希望大家可以帮助完善,也希望可以给个Star。https://github.com/HistoryZhang/LazyScrollView。 原文地址:苹果核 - iOS 高性能异构滚动视图构建方案 —— LazyScrollView(里面还有很多干货)。 最后说一下目前写的几个问题,希望大家可以一起来优化:
贴一段第二个问题的代码: - (NSMutableSet *)findSetWithMinEdge:(CGFloat)minEdge { NSArray *ascendingEdgeArray = [self.allRects sortedArrayUsingComparator:^NSComparisonResult(LSVRectModel *obj1, LSVRectModel *obj2) { return CGRectGetMinY(obj1.absRect) > CGRectGetMinY(obj2.absRect) ? NSOrderedDescending : NSOrderedAscending; }]; // TOOD: 此处待优化 // 二分法 NSInteger minIndex = 0; NSInteger maxIndex = ascendingEdgeArray.count - 1; NSInteger midIndex = (minIndex + maxIndex) / 2; LSVRectModel *model = ascendingEdgeArray[midIndex]; while (minIndex < maxIndex - 1) { if (CGRectGetMinY(model.absRect) > minEdge) { maxIndex = midIndex; } else { minIndex = midIndex; } midIndex = (minIndex + maxIndex) / 2; model = ascendingEdgeArray[midIndex]; } midIndex = MAX(midIndex - 1, 0); NSArray *array = [ascendingEdgeArray subarrayWithRange:NSMakeRange(midIndex, ascendingEdgeArray.count - midIndex)]; return [NSMutableSet setWithArray:array];} 再贴一段第三个问题的代码: NSMutableArray *newVisibleViews = [self visiableViewModels].mutableCopy; NSMutableArray *newVisibleLsvIds = [newVisibleViews valueForKey:@"lsvId"]; NSMutableArray *removeViews = [NSMutableArray array]; for (UIView *view in self.visibleViews) { if (![newVisibleLsvIds containsObject:view.lsvId]) { [removeViews addObject:view]; } } for (UIView *view in removeViews) { [self.visibleViews removeObject:view]; [self enqueueReusableView:view]; [view removeFromSuperview]; } ##项目引用已经支持 ##更新记录
|
请发表评论