思路
就是我们在横向滚动分页视图的的时候,触发横向scrollView 的
scrollViewDidscroll 代理方法,
然后获取到我们我们将要滚动到的那一个分页,
然后执行将要获取的分页的willAppear, 当前分页的viewDidAppear,
并设置将要展示的will-appearIndex, 等到滚动结束的时候,
执行willapperaindex位置的didAppear,
这里有两个重要的点
1 因为我们是在 scrollViewDidscroll 执行willappear的
所有要避免重复执行,:
这里我们通过判断self.willDisappearIndex == -1,因为我们符合条件
执行之后,self.willDisappearIndex就不是-1 了,并在停止滚动之后,将self.willDisappearIndex 置为-1
2 获取将要滚动到的index:
这里我们通过
CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
NSInteger leftIndex = floorf(ratio);
的方法,获取到当前偏移量左边的index,然后和当前的currentIndex
对比,获取到将要展示index.
代码
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (!scrollView.isDragging && !scrollView.isTracking && !scrollView.isDecelerating) {
return;
}
CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
NSInteger maxCount = round(scrollView.contentSize.width/scrollView.bounds.size.width);
NSInteger leftIndex = floorf(ratio);
leftIndex = MAX(0, MIN(maxCount - 1, leftIndex));
NSInteger rightIndex = leftIndex + 1;
if (ratio < 0 || rightIndex >= maxCount) {
[self listDidAppearOrDisappear:scrollView];
return;
}
if (rightIndex == self.currentIndex) {
//当前选中的在右边,用户正在从右边往左边滑动
if (self.listDict[@(leftIndex)] != nil) {
if (self.willAppearIndex == -1) {
self.willAppearIndex = leftIndex;
[self listWillAppear:self.willAppearIndex];
}
}
if (self.willDisappearIndex == -1) {
self.willDisappearIndex = rightIndex;
[self listWillDisappear:self.willDisappearIndex];
}
}else {
//当前选中的在左边,用户正在从左边往右边滑动
if (self.listDict[@(rightIndex)] != nil) {
if (self.willAppearIndex == -1) {
self.willAppearIndex = rightIndex;
[self listWillAppear:self.willAppearIndex];
}
}
if (self.willDisappearIndex == -1) {
self.willDisappearIndex = leftIndex;
[self listWillDisappear:self.willDisappearIndex];
}
}
[self listDidAppearOrDisappear:scrollView];
}
当然我们使用ceilf函数也是可以的,但是要注意反过来使用
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
if (!scrollView.isDragging && !scrollView.isTracking && !scrollView.isDecelerating) {
return;
}
CGFloat ratio = scrollView.contentOffset.x/scrollView.bounds.size.width;
NSInteger maxCount = round(scrollView.contentSize.width/scrollView.bounds.size.width);
NSInteger rightIndex = ceilf(ratio);
rightIndex = MAX(0, MIN(maxCount - 1, rightIndex));
NSInteger leftIndex = rightIndex - 1;
if (ratio < 0 || rightIndex >= maxCount) {
[self listDidAppearOrDisappear:scrollView];
return;
}
if (leftIndex == self.currentIndex) {
//当前选中的在右边,用户正在从右边往左边滑动
if (self.listDict[@(leftIndex)] != nil) {
if (self.willAppearIndex == -1) {
self.willAppearIndex = rightIndex;
[self listWillAppear:self.willAppearIndex];
}
}
if (self.willDisappearIndex == -1) {
self.willDisappearIndex = leftIndex;
[self listWillDisappear:self.willDisappearIndex];
}
}else {
//当前选中的在左边,用户正在从左边往右边滑动
if (self.listDict[@(rightIndex)] != nil) {
if (self.willAppearIndex == -1) {
self.willAppearIndex = leftIndex;
[self listWillAppear:self.willAppearIndex];
}
}
if (self.willDisappearIndex == -1) {
self.willDisappearIndex = rightIndex;
[self listWillDisappear:self.willDisappearIndex];
}
}
[self listDidAppearOrDisappear:scrollView];
}
设置self.willDisappearIndex = -1 避免重复执行
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
if (!decelerate) {
// 滑动到一半又取消滑动处理
if (self.willDisappearIndex != -1) {
[self listWillAppear:self.willDisappearIndex];
[self listWillDisappear:self.willAppearIndex];
[self listDidAppear:self.willDisappearIndex];
[self listDidDisappear:self.willAppearIndex];
self.willDisappearIndex = -1;
self.willAppearIndex = -1;
}
}
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
// 滑动到一半又取消滑动处理
if (self.willDisappearIndex != -1) {
[self listWillAppear:self.willDisappearIndex];
[self listWillDisappear:self.willAppearIndex];
[self listDidAppear:self.willDisappearIndex];
[self listDidDisappear:self.willAppearIndex];
self.willDisappearIndex = -1;
self.willAppearIndex = -1;
}
}