iOS之UIScrollView

来源:互联网 发布:美工做好图怎么上传 编辑:程序博客网 时间:2024/06/11 01:33

UIScrollView

UIScrollView继承自UIView,包含有三个子类:UITableView,UITextView,UICollectionView。UIScrollView是一种容器视图,当内容超出屏幕时,可以提供水平或者垂直滚动条。

下面通过一个例子来对UIScrollView进行一个初步的了解

//创建两个viewController(A和B),在A中实现垂直方向的滚动浏览一组图片,点击图片去到B,然后打开所点击的图片,并且可以水平滚动查看图片- (void)viewDidLoad {    [super viewDidLoad];//在A中 /*     scrollView出现坐标异常的情况     1.视图控制器在导航控制器中     2.视图控制器的根视图的第一子视图是scrollView     */     //首先通过IB将A压入到navigationController中,在storyboard中选中A->选择Editor->Embin->Navigation Controllerif ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0?YES:NO) {        self.edgesForExtendedLayout = UIRectEdgeNone;//由于加入了导航控制器,scrollView的坐标会出现异常,加上此句可解决异常问题    }UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight)];//ScreenWidth,ScreenHeight为宏定义的屏幕宽高 [self.view addSubview:scrollView];//添加图片到mImages数组中NSMutableArray *mImages = [NSMutableArray array];    for (int i = 0; i < 10; i++) {            UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"anglebaby%d",i+1]];        [mImages addObject:image];    } //通过双层for循环来创建 //控制行数    int count = 0;    if (mImages.count % 3 == 0) {        count = (int)mImages.count/3;    }    else {        count = (int)mImages.count/3 + 1;    }    CGFloat height = (ScreenHeight-64)/2;    CGFloat width = ScreenWidth/3;    //用来计数,防止数循环超出数组范围    int num = 0;    for (int i = 0; i < count; i++) {        //控制图片为3列        for (int j = 0; j < 3; j++) {            //超过数组元素个数则跳出循环            if (num >= mImages.count) {                break;            }            //创建button            UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];            button.frame = CGRectMake(width * j, height *i , width, height);            //设置button图片            [button setImage:mImages[num] forState:UIControlStateNormal];            //添加点击事件            [button addTarget:self action:@selector(clickAction:) forControlEvents:UIControlEventTouchDown];             [scrollView addSubview:button];            num++;            button.tag = 101 + num;        }    }    //设置scrollView内容大小,该处只要在垂直方向上滚动,所以width为0    scrollView.contentSize = CGSizeMake(0, height * count + 64);    //隐藏滚动条    scrollView.showsVerticalScrollIndicator = NO;    //把self作为scrollView的代理    scrollView.delegate = self;}//点击事件方法- (void)clickAction:(UIButton *)sender {     self.bvc = [[BViewController alloc] init];     //push到B    [self.navigationController pushViewController:self.bvc animated:YES];    NSLog(@"%lu",sender.tag);    //传值    self.bvc.tag = sender.tag;}//指示当用户点击状态栏候,滚动视图是否能够滚动到顶部,需要设置scrollView.scrollToTop = YES;//默认YES- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {       return YES;}- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {    NSLog(@"%s",__func__);}//在B中- (void)viewDidLoad {    [super viewDidLoad];//    NSLog(@"1");    if ([[UIDevice currentDevice].systemVersion floatValue] >= 7.0? YES:NO) {//三目运算符        //        self.automaticallyAdjustsScrollViewInsets = NO;//自动调整scrollView坐标异常        self.edgesForExtendedLayout = UIRectEdgeNone;    }    //滚动视图    _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, ScreenWidth, ScreenHeight-64)];    //    scrollView.backgroundColor = [UIColor yellowColor];    _scrollView.delegate = self;    [self.view addSubview:_scrollView];    _mImages = [NSMutableArray array];    for (int i = 0; i < 10; i++) {        UIImage *image = [UIImage imageNamed:[NSString stringWithFormat:@"anglebaby%d",i+1]];        [_mImages addObject:image];    }    [self.mImages insertObject:[UIImage imageNamed:@"anglebaby10"] atIndex:0];    [self.mImages insertObject:[UIImage imageNamed:@"anglebaby1"] atIndex:11];    //控制滚动范围的属性    _scrollView.contentSize = CGSizeMake(ScreenWidth*_mImages.count, 0);    _scrollView.tag = 1000;    [_scrollView setContentOffset:CGPointMake(ScreenWidth*(self.tag-102+1), 0) animated:YES];    for (int i = 0; i < _mImages.count; i++) {        _smallScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(ScreenWidth*i, 0, ScreenWidth, ScreenHeight-64)];        UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.smallScrollView.bounds];        imageView.image = _mImages[i];//        imageView.contentMode = UIViewContentModeScaleAspectFit;        [_smallScrollView addSubview:imageView];        [_scrollView addSubview:_smallScrollView];        //控制最大缩放比例        _smallScrollView.maximumZoomScale = 2.0;        //控制最小缩放比例        _smallScrollView.minimumZoomScale = 1.0;        _smallScrollView.delegate = self;        //关闭边界回弹效果        _smallScrollView.bounces = NO;    }    //按页滚动    _scrollView.pagingEnabled = YES;    //水平方向滚动条    _scrollView.showsHorizontalScrollIndicator = NO;    self.view.backgroundColor = [UIColor whiteColor];    //初始化pageControl    _pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake((ScreenWidth-200)/2, ScreenHeight-100, 200, 30)];    _pageControl.numberOfPages = self.mImages.count;    _pageControl.currentPage = self.tag-102;    [_pageControl addTarget:self action:@selector(pageControlAction:) forControlEvents:UIControlEventValueChanged];    _pageControl.backgroundColor = [UIColor blackColor];    [self.view addSubview:_pageControl];}//UIScrollViewDelegate协议- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {    UIImageView *imgView = [scrollView.subviews objectAtIndex:0];    return imgView;}- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {    NSLog(@"%s",__func__);}- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {    NSLog(@"%s",__func__);}- (void)scrollViewDidZoom:(UIScrollView *)scrollView {    NSLog(@"%s",__func__);}//只要是拖拽scrollView就会触发这个方法- (void)scrollViewDidScroll:(UIScrollView *)scrollView {    NSLog(@"%s",__func__);    if (scrollView.contentOffset.x < ScreenWidth-30) {        [scrollView setContentOffset:CGPointMake(ScreenWidth * 10, 0) animated:NO];    }    else if (scrollView.contentOffset.x > ScreenWidth*11+30) {        [scrollView setContentOffset:CGPointMake(ScreenWidth, 0) animated:NO];    }}//开始拖拽的时候会触发这个方法- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {    NSLog(@"%s",__func__);}//将要结束拖拽的时候会触发这个方法- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {    NSLog(@"%s",__func__);}//当结束多拽的时候会触发这个方法- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {    NSLog(@"结束拖拽");}//当滚动减速的时候会触发这个方法- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {    NSLog(@"减速滚动");}//当滚动彻底停止的时候会触发这个方法- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {    UIScrollView *bigScrollView = (UIScrollView *)[self.view viewWithTag:1000];   int page = bigScrollView.contentOffset.x/ScreenWidth;    _pageControl.currentPage = page;    NSLog(@"滚动停止");}//当滚动视图动画完成后,调用该方法,如果没有动画,那么该方法不被调用- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {    NSLog(@"%s",__func__);}//指示当用户点击状态栏候,滚动视图是否能够滚动到顶部,需要设置scrollView.scrollToTop = YES;- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {    return YES;}- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {    NSLog(@"%s",__func__);}- (void)pageControlAction:(UIPageControl *)sender {    NSLog(@"%ld",sender.currentPage);}
0 0