UIScrollView

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UIScrollView相关的知识,希望对你有一定的参考价值。

?、UIScrollView的创建和常?属性
 
  • UIScrollView是UIView的?类,所以我们可以仿照UIView的 创建步骤创建?个ScrollView。
  • UIScrollView作为所有滚动视图的基类,所以学好 UIScrollView也成为学好UITableView和UICollectionView等 滚动视图的前提。
  • UIScrollView主要使?在滚动头条(轮播图), 相册等常见的 功能?。
 
?、UIScrollView的协议?法
 
  • 当我们签好协议,设置好代理?之后,我们就可以使? UIScrollView的协议?法了,它的协议?法分为两部分:
  • ?是监控滚动时候的状态。
  • ?是控制视图的缩放。
 
#pragma mark -----代理检测滚动过程时触发的方法-----

//1、滚动过程中触发的方法
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    NSLog(@"正在滚动");
}

//2、即将开始拖拽的方法,此时滚动视图即将加速
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
    NSLog(@"即将进行拖拽");
}

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

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

//5、结束减速,也就是停止滚动
- (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];//因为scrollView内自带两个滑动视图,也是子视图,所以只能用firstObject或者objiectAtIndex:0
}

//缩放结束
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {
    NSLog(@"%@",NSStringFromCGSize(scrollView.contentSize));
}

//正在缩放
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {
    //实现中心缩小
    UIImageView *imageView = [scrollView.subviews firstObject];
    if (scrollView.zoomScale <= 1.0) {
        imageView.center = CGPointMake(kWidth / 2, kHeight / 2);
    }
}
 
- (void)tap:(UITapGestureRecognizer *)tap {
    UIImageView *image = (UIImageView *)tap.view;
    NSLog(@"%ld",image.tag);
   
    FirstViewController *firstVC = [[FirstViewController alloc] init];
    [self.navigationController pushViewController:firstVC animated:YES];
    [firstVC release];
}
 
- (void)viewDidLoad {
    [super viewDidLoad];
   
    //创建滚动视图
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
    //设置滚动视图的相关属性
    //1、滚动区域,内容区域的大小
   
    //如果想要实现滚动操作,有三种情况:
    //1、内容视图(滚动区域)的宽大于滚动视图的宽
    //2、内容视图(滚动区域)的高大于滚动视图的高
    //3、内容视图(滚动区域)的宽和高都大于滚动视图的宽和高
   
 
//UIScrollView?来控制滚动范围的重要属性contentSize,通过这个重要属性设置才可以控制视图的滚动,我们?标铺设9个屏幕宽度的图?,所以我们设置滚动范围是9个屏幕宽度contentSize有两个参数,?个是width,另?个是height,分别设置两个值有不同的效果
    scrollView.contentSize = CGSizeMake(kWidth * 9, kHeight);//横屏滚动
   
      //设置滚动视图的代理
    scrollView1.delegate = self;
 
    //滚动视图的偏移量
    scrollView.contentOffset = CGPointMake(0, 0);
   
    //整页滚动
    scrollView.pagingEnabled = YES;
   
    //关闭横向滚动条
    scrollView.showsHorizontalScrollIndicator = NO;
   
    //关闭纵向滚动条
//    scrollView.showsVerticalScrollIndicator = NO;
   
    //关闭滚动视图的回弹效果(默认是开启的)
    scrollView.bounces = NO;
   
    //展示图片 for循环创建9个UIImageView并且添加到滚动视图上面
     for (int i = 0; i < 9; i ++) {
       
        UIImageView *imageView1 = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, kWidth, kHeight)];
        imageView1.image = [UIImage imageNamed:[NSString stringWithFormat:@"%d.jpg",i + 1]];
       
        imageView1.tag = 100 + i;
 
        //创建小scrollView
        UIScrollView * scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, kHeight * i, kWidth, kHeight)];
       
        //指定代理
        scroll.delegate = self;
 
         /*
    //如果想实现视图的缩放功能,必须指定缩放的视图以及缩放的比例
    //指定缩放视图需要实现代理方法,指定缩放比例,是为滚动设置缩放比例
     */
 
        //指定缩放比例
        scroll.minimumZoomScale = 0.5;
        scroll.maximumZoomScale = 2.0;
 
       // 设置当前的?例
     //    scroll.zoomScale = 1;
        [scroll addSubview:imageView1];
 
      imageView1.userInteractionEnabled = YES; 
 
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
        //拍一次
        tap.numberOfTapsRequired = 1;
        //一根手指
       tap.numberOfTouchesRequired = 1;
        [imageView1 addGestureRecognizer:tap];   
        [scrollView addSubview:scroll];
       
        [scroll release];
        [imageView1 release];   
    }
   
    [self.view addSubview:scrollView];
    [scrollView release];
    // Do any additional setup after loading the view.
}
 
三、UIScrollView和UIPageControl的结合使?
 
我们可以通过UIPageControl的点击事件和UIScrollView的 偏移量实现?者的关联使?
?先给UIPageControl设定点击事件。
 
[page addTarget:self action:@selector(pageControlAction:)forControlEvents:UIControlEventValueChanged];
 
// 在pageControl的点击?法?对ScrollView进?关联,通过操作
    scrollView的偏移量ContentOffset进?视图上得切换
    - (void)pageControlAction:(UIPageControl *)page
    {
        // 通过tag值先找到要操作的scrollView对象
        UIScrollView *scroll = (UIScrollView *)[self.view viewWithTag:1000];
        // 根据pageControl当前的?数乘以屏幕宽度计算当前的偏移量,?带动画的?法能让切换过程中更加柔和
        [scroll setContentOffset:CGPointMake(page.currentPage * WIDTH, 0) animated:YES];
    }
 
我们完成了pageControl对scrollView的控制操作,接下来实现scrollView对 pageControl的操作
 
//先找到scrollView的滚动结束触发的协议?法
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
        NSLog(@"当停?的时候触发");
        // 先通过tag值找到要操作的视图
        UIPageControl *page = (UIPageControl *)[self.view viewWithTag:2000];
        // 根据当前scrollView的偏移量计算出来当前是第?张图?,让pageControl显?对应的?数
        page.currentPage = scrollView.contentOffset.x / WIDTH;
    }
 
 
 

以上是关于UIScrollView的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollView 中关于 UITableView 的教程或示例代码

代码;根据内容自动设置 UIScrollView 的高度

纯代码实现横向滚动的UIScrollView

UIScrollView 没有滚动?

UIScrollView 委托如何知道我的 UIScrollView ivar?

在代码中创建 UIScrollView 子类,在哪里添加子视图?