iOS之UIScrollView

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 Controller
if ([[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);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值