您的位置:首页 > Web前端 > JavaScript

JScrollView_PageControl_AutoScroll 阅读心得

2015-05-10 21:56 337 查看
UIScrllView的一些代理方法

#pragma mark UIScrollViewDelegate

// 触摸屏幕来滚动画面还是其他的方法使得画面滚动,皆触发该函数

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    NSLog(@"Scrolling...");

}

// 触摸屏幕并拖拽画面,再松开,最后停止时,触发该函数

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {

    NSLog(@"scrollViewDidEndDragging  -  End of Scrolling.");

}

// 滚动停止时,触发该函数

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

    NSLog(@"scrollViewDidEndDecelerating  -   End of Scrolling.");

}

// 调用以下函数,来自动滚动到想要的位置,此过程中设置有动画效果,停止时,触发该函数

// UIScrollView的setContentOffset:animated:     这个被定时器使用,animated设置成了YES

// UIScrollView的scrollRectToVisible:animated:

// UITableView的scrollToRowAtIndexPath:atScrollPosition:animated:

// UITableView的selectRowAtIndexPath:animated:scrollPosition:

- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {

    NSLog(@"scrollViewDidEndScrollingAnimation  -   End of Scrolling.");

}

///>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>///

有人说这个实现其实就一个跑马灯的实现。,目前来看使用FIFO也是可以实现的。这样实用的是固定3个imageView,而且始终使用这3个View

JScrollView_PageControl_AutoScroll的实现 这个有个缺陷就是如果图片只有一张时,也会自动循环播放,且pageController也会有一个小点点,这个地方需要改造!!!!

在初始化时会生成一个imageView的数组,讲当前所有的image放到数组中去,后面切换的是imageView。 这个地方可以替换成image数组,在使用sd_iimageDownLoad会不会好些。

这里是的无限循环,定时刷新图片,其主要的原理就是,其实没次只载入三种图片,firstImageView,middleImageView,lastImageView,但是每次显示的时候显示的是middleImageView

    CGSize scrollSize=_scrollView.bounds.size;

    [firstView setFrame:CGRectMake(0, 0, scrollSize.width, scrollSize.height)];

    [middleView setFrame:CGRectMake(scrollSize.width, 0, scrollSize.width, scrollSize.height)];

    [lastView setFrame:CGRectMake(scrollSize.width*2, 0, scrollSize.width, scrollSize.height)];

    [_scrollView addSubview:firstView];

    [_scrollView addSubview:middleView];

    [_scrollView addSubview:lastView];

    //自动timer滑行后自动替换,不再动画

    [_scrollView setContentOffset:CGPointMake(self.bounds.size.width, 0) animated:NO]; --这个就是通过设置contentOffset值来确定当前显示的是middleImageView。

要实现无限循环,则需要对page进行处理, page处理包括两个方面

1. 定时器

直接对当前的page值就行循环加,如果超过最大一个则置成0,然

后调用[_scrollView setContentOffset:CGPointMake(self.bounds.size.width*2, 0) animated:YES];

这句话的作用就是设置contentOffset值时携带动画,当动画停止时contentOffset才会改变,所以如果你只是animated:NO,则contentOffset会立即改变

设置了YES,在动画结束后会调用- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView

{[self reloadData];}

2. 手左右滑动

直接走到- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

{其中  scrollView.contentOffset.x; 已经修改掉,主要修改过程是左滑x=0,右滑x=640}

因为一开始就只载入3张,且那时contentOffset置在中间,所以只能左滑右滑一次

计算好page,计算规则是

如果是右滑,当达到最大值,page则=0,否则page++;

如果是左滑,当达到最小值,page则=[array count]-1,否则page--;

调用{[self reloadData];}设置当前page的3个imageview的内容

-(void)reloadData实现过程

{

1. 将3个imageView从当前scrollView中移除

    [firstView removeFromSuperview];

    [middleView removeFromSuperview];

    [lastView removeFromSuperview];

2. 根据当前的page重新计算得到3个view对应的imageView

这里分了3个逻辑

a. page = 0;

b. page =[_viewArray count]-1

c. 介于两者之间

3. 重新设置3个view的frame,这里重点提到下x坐标 fristView = 0; middleView=mainScreen.size.width;lastView=mainScreen.size.width*2;

4. 设置scrollView的contentOffset为middleView.x

[_scrollView setContentOffset:CGPointMake(self.bounds.size.width, 0) animated:NO]; ===z这里应该有个大的疑问,就是通过滑动或者定时器进入到这里时,其实载入的图像已经改变了,为何还要调用这个了,其实仔细观察这里的middleView就是已经被滑动过来当前显示的view,这里要重新设置下当地的scroll的contentOffset为millde才能方便后面的滑动和定时器的滑动。

}

建议以上的的firstView修改成prevView,middleView修改成currentView,lastView修改成NextView,这样更好理解些。

这些如何配合现有的SDW?的载入图像的第三方库实现了???
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: