UIScrollView 边界问题处理

来源:互联网 发布:读书笔记本软件 编辑:程序博客网 时间:2024/05/18 23:57


      在写引导页 或者 教学页的时候 会有scrollview 上放上多张图片,滑动显示下一张的问题 ,当scrollview到最后一张继续往左滑动的时候右边会有白色部分。

这个就是UIScrollView 边界问题。 scrollview 有一个特别重要的属性 bounces 之前用的少,今天发现这个属性是非常重要的。


(1)当bounces属性设置为YES时,当UIScrollView中图片滑动到边界的时候会出现弹动的效果,就像是Linux中的果冻效果一样。

(2)当bounces属性设置为NO时,当UIScrollView中图片滑动到边界时会直接定在边界就不会有弹动的效果。


    我将bounces属性设置为NO,这样就解决了一个bug。就是在滑动到最左端的图片时,再向左滑动就滑动不了,向右滑动也是一样的道理。这样就解决了数组越界所导致的崩溃问题。



#define kNumberOfPages2

#define KDEVICEWIDTH    [[UIScreen mainScreen] bounds].size.width

#define KDEVICEHEIGHT    [[UIScreen mainScreen] bounds].size.height


#import "ViewController.h"


@interfaceViewController ()<UIScrollViewDelegate>

{

    int currentPage;


}

@property (nonatomic,strong)UIScrollView *scrollView;

@property (nonatomic,strong)UIPageControl *pageControl;

@property (nonatomic,strong)UIImageView  *backgroundImgV;

@property (nonatomic,strong)UIImageView  *backgroundImgV2;

@end


@implementation ViewController


- (void)viewDidLoad {

    [superviewDidLoad];



    _scrollView = [[UIScrollViewalloc]initWithFrame:CGRectMake(0,0,KDEVICEWIDTH,KDEVICEHEIGHT)];

    _scrollView.pagingEnabled =YES;

    _scrollView.clipsToBounds =NO;

    _scrollView.contentSize =CGSizeMake(_scrollView.frame.size.width * kNumberOfPages, _scrollView.frame.size.height);

    _scrollView.showsHorizontalScrollIndicator =NO;

    _scrollView.showsVerticalScrollIndicator =NO;

    

    /**

     *  注意这里的属性  bouncesyes的时候 scrollview达到边界的时候还是可以拖动会有白色的弹性空白显示出来设置为no的时候到边界的时候就没有拖动了

     */

    _scrollView.bounces =NO;

    

    _scrollView.scrollsToTop =NO;

    _scrollView.delegate =self;

    [_scrollViewsetContentOffset:CGPointMake(0,0)];

    

    [self.viewaddSubview:_scrollView];

    [selfcreateAllEmptyPagesForScrollView:kNumberOfPages];

    

    currentPage =0;

    _pageControl.backgroundColor = [UIColorredColor];//无效不允许修改内部

    _pageControl = [[UIPageControlalloc]initWithFrame:CGRectMake(KDEVICEWIDTH/2,KDEVICEHEIGHT-20,5,5)];

    _pageControl.center =CGPointMake(_scrollView.frame.size.width / 2.0, _scrollView.frame.size.height -15);

    _pageControl.numberOfPages =kNumberOfPages;

    _pageControl.currentPage =0;

    [self.viewaddSubview:_pageControl];

}



-(void)createAllEmptyPagesForScrollView:(int)pages

{

    if (pages<0) {

        return;

    }

    

    

    for (int i =0; i<pages; i++) {

        CGRect sframe =_scrollView.frame;

        UIImageView *imgV = [[UIImageViewalloc]initWithFrame:CGRectMake(sframe.size.width * i,0 , KDEVICEWIDTH,KDEVICEHEIGHT)];

        NSString *imageName = [NSStringstringWithFormat:@"huanyinye%d",i];

        imgV.image = [UIImageimageNamed:imageName];

        [_scrollViewaddSubview:imgV];

        if (i == pages-1) {

            UIButton *btn = [[UIButtonalloc]initWithFrame:CGRectMake((KDEVICEHEIGHT/2 -60)+KDEVICEWIDTH*i,KDEVICEHEIGHT -60,120,40)];

//            [btn addTarget:self action:@selector(scale_2) forControlEvents:UIControlEventTouchUpInside];

            [_scrollViewaddSubview:btn];

        }

    }

}

#pragma mark ====== delegate


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

    CGFloat pageWidth =self.scrollView.frame.size.width;

    int page =floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

    if (page <0 || page >=kNumberOfPages) {

        return;

    }

    _pageControl.currentPage = page;

    

}



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

}



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

    CGFloat pageWidth =self.scrollView.frame.size.width;

    int page =floor((self.scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;

    _pageControl.currentPage = page;

    currentPage = page;

}




- (void)didReceiveMemoryWarning {

    [superdidReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end


0 0