UIScrollView可以用于显示多于一个屏幕的内容,超出屏幕范围的内容可以通过滑动进行查看,附上轮播图的传送门。

  我们来试着做一个简单的,首先我们可以用宏定义来保存屏幕的高度跟宽度。

// 定义保存屏幕宽度和高度的宏
#define kWidth self.view.frame.size.width
#define kHeight self.view.frame.size.height

  接下来,就到了创建,跟设置了。

 

UIScrollView *scrollView = [[UIScrollView alloc]    initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
    
    // 设置滚动视图的相关属性
    // 1、滚动区域,内容区域的大小
    // 如果想要实现滚动操作,有三种情况
    /**
        1、内容视图(滚动区域)的宽度大于滚动视图的宽
        2、内容视图(滚动区域)的高大于滚动视图的高
        3、内容视图(滚动区域)的宽和高都大于滚动视图的宽和高
     */
    
    /**
     *  如果想实现股东视图的缩放功能,必须指定缩放的视图以及缩放的比例
     *  指定所发那个视图需要实现代理方法,指定缩放比例,是为滚动设置缩放比例
     */
    
//    scrollView.minimumZoomScale = 0.5; // 最小缩放比例
//    scrollView.maximumZoomScale = 2.0; // 最大缩放比例
    
    scrollView.contentSize = CGSizeMake(7 * kWidth, kHeight);
    
    // 滚动视图偏移量
    scrollView.contentOffset = CGPointMake(0, 0);
    
    // 整页滚动
    scrollView.pagingEnabled = YES;
    
    // 关闭横向显示条
    scrollView.showsHorizontalScrollIndicator = NO;

    // 关闭滚动视图的回弹效果(默认是开启的)
    scrollView.bounces = NO;
    
    // 设置滚动视图的代理
    scrollView.delegate = self;
    
    // for循环创建七个UIImageView并且添加到滚动视图上面
    for (int i = 0; i < 7; i++) {
        // 先创建小scrollView
        UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
        imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg", i]];
        
        UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(i * kWidth, 0, kWidth, kHeight)];
        scroll.delegate = self;
        scroll.minimumZoomScale = 0.5; // 最小缩放比例
        scroll.maximumZoomScale = 2.0; // 最大缩放比例
        
        [scroll addSubview:imageView];
             
        [scrollView addSubview:scroll];
         }
    [self.view addSubview:scrollView];

  如果只用一个UIScrollView来存放所以的图片,那么图片的放大缩小会使UIScrollView不能正常的滚动,所以我们需要先用一个小的UIScrollView来存放图片,然后再把小的UISrollVIew放到大的里面,这样的话,放大缩小图片对大的UIScrollView没有影响了。

  我们还需要给UIScrollView添加代理,这样才能完成后续的工作。 <UIScrollViewDelegate>。

  

// 滚动过程中触发的方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"正在滚动");
//    CGFloat scrollX = scrollView.center.x;
//    CGFloat scrollY = scrollView.center.y;
//    
//    scrollX = scrollView.contentSize.width > scrollView.frame.size.width ? scrollView.contentSize.width / 2 : scrollX;
//    
//    scrollY = scrollView.contentSize.height > scrollView.frame.size.height ? scrollView.contentSize.height / 2 : scrollY;
//    
//    UIImageView *image = [scrollView.subviews firstObject];
//    
//    image.center = CGPointMake(scrollX, scrollY);
}

// 即将开始拖拽的方法,吃屎桂东视图即将加速
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@"即将进行拖拽");
}

// 结束拖拽的方法,不再加速
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    NSLog(@"拖拽结束");
}

// 即将开始减速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {
    NSLog(@"即将开始减速");
}

// 结束减速,也就是停止滚动
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    NSLog(@"结束滚动");
    
    // 先从负责滚动的⼤scrollView找到他的⼦视图
    for (UIScrollView *sView in scrollView.subviews){
        // 在根据⼦类的对象类型进⾏判断
        if ([sView isKindOfClass:[UIScrollView class]]){
            // 把视图的尺⼨恢复到原有尺⼨
            sView.zoomScale = 1.0;
        }
    }
}

  上面便是比较常用的代理方法。接下来就是缩放的方法。

// 指定缩放视图
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [scrollView.subviews firstObject];
}

- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    UIImageView *imageView = [scrollView.subviews firstObject];
    
    if (scrollView.zoomScale <= 1.0) {
        imageView.center = CGPointMake(kWidth / 2, kHeight / 2);
    }
}

  这样就完成了一个比较简单的小东西。