• IOS中的UIScrollView


    要引用UIScrollView 首先要遵循UIScrollViewDelegate协议

    然后重写

    //1.拖拽方法
    -(void)scrollViewDidScroll:(UIScrollView *)scrollView;
    //2.即将开始拖拽的方法
    -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
    //3.拖拽完毕的方法
    -(void)scrollViewDidEndDragging:(UIScrolView *) scrollView willDecelerate:(BOOL)decelerate

    下面是一个带轮询展示界面的小案例

    #import "ViewController.h"
    
    @interface ViewController () <UIScrollViewDelegate>
    @property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
    @property (weak, nonatomic) IBOutlet UIPageControl *pageControl;
    
    // 创建一个用来引用计时器对象的属性
    @property (nonatomic, strong) NSTimer *timer;
    
    @end
    
    @implementation ViewController
    
    // 实现UIScrollView的滚动方法
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        
        // 如何计算当前滚动到了第几页?
        // 1. 获取滚动的x方向的偏移值
        CGFloat offsetX = scrollView.contentOffset.x;
        // 用已经偏移了得值, 加上半页的宽度
        offsetX = offsetX + (scrollView.frame.size.width * 0.5);
        
        // 2. 用x方向的偏移的值除以一张图片的宽度(每一页的宽度),取商就是当前滚动到了第几页(索引)
        int page = offsetX / scrollView.frame.size.width;
        
        // 3. 将页码设置给UIPageControl
        self.pageControl.currentPage = page;
        
        //NSLog(@"滚了,要在这里根据当前的滚动来计算当前是第几页。");
    }
    
    // 实现即将开始拖拽的方法
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
    {
        // 停止计时器
        // 调用invalidate一旦停止计时器, 那么这个计时器就不可再重用了。下次必须重新创建一个新的计时器对象。
        [self.timer invalidate];
        
        // 因为当调用完毕invalidate方法以后, 这个计时器对象就已经废了,无法重用了。所以可以直接将self.timer设置为nil
        self.timer = nil;
    }
    
    // 实现拖拽完毕的方法
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
    {
    
        // 重新启动一个计时器
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES];
        
        // 再次修改一下新创建的timer的优先级
        // 修改self.timer的优先级与控件一样
        // 获取当前的消息循环对象
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        // 改变self.timer对象的优先级
        [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];
    }
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // 动态创建UIImageView添加到UIScrollView中
        
        CGFloat imgW = 300;
        CGFloat imgH = 130;
        CGFloat imgY = 0;
        
        // 1. 循环创建5个UIImageView添加到ScrollView中
        for (int i = 0; i < 5; i++) {
            // 创建一个UIImageView
            UIImageView *imgView = [[UIImageView alloc] init];
            
            // 设置UIImageView中的图片
            NSString *imgName = [NSString stringWithFormat:@"img_%02d", i + 1];
            imgView.image = [UIImage imageNamed:imgName];
            
            // 计算每个UIImageView在UIScrollView中的x坐标值
            CGFloat imgX = i * imgW;
            // 设置imgView的frame
            imgView.frame = CGRectMake(imgX, imgY, imgW, imgH);
            
            // 把imgView添加到UIScrollView中
            [self.scrollView addSubview:imgView];
        }
        
        
        // 设置UIScrollView的contentSize(内容的实际大小)
        CGFloat maxW = self.scrollView.frame.size.width * 5;
        self.scrollView.contentSize = CGSizeMake(maxW, 0);
        
        
        // 实现UIScrollView的分页效果
        // 当设置允许分页以后, UIScrollView会按照自身的宽度作为一页来进行分页。
        self.scrollView.pagingEnabled = YES;
        
        // 隐藏水平滚动指示器
        self.scrollView.showsHorizontalScrollIndicator = NO;
        
        // 指定UIPageControl的总页数
        self.pageControl.numberOfPages = 5;
        
        // 指定默认是第0页
        self.pageControl.currentPage = 0;
        
        
        // 创建一个"计时器"控件NSTimer控件
        // 通过scheduledTimerWithInterval这个方法创建的计时器控件, 创建好以后自动启动
        self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(scrollImage) userInfo:nil repeats:YES];
        
        // 修改self.timer的优先级与控件一样
        // 获取当前的消息循环对象
        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        // 改变self.timer对象的优先级
        [runLoop addTimer:self.timer forMode:NSRunLoopCommonModes];
        
    //    [self.scrollView bringSubviewToFront:self.pageControl];
        
        
    }
    
    // 自动滚动图片的方法
    // 因为在创建计时器的时候, 指定了时间间隔是1.0秒,所以下面这个方法每隔一秒钟执行一次
    - (void)scrollImage
    {
        // 每次执行这个方法的时候, 都要让图片滚动到下一页
        // 如何让UIScrollView滚动到下一页?
        // 1. 获取当前的UIPageControl的页码
        NSInteger page = self.pageControl.currentPage;
        
        // 2. 判断页码是否到了最后一页, 如果到了最后一页, 那么设置页码为0(回到第一页)。如果没有到达最后一页, 则让页码+1
        if (page == self.pageControl.numberOfPages - 1) {
            // 表示已经到达最后一页了
            page = 0; // 回到第一页
        } else {
            page++;
        }
        // 3. 用每页的宽度 * (页码 + 1) == 计算除了下一页的contentOffset.x
        CGFloat offsetX = page * self.scrollView.frame.size.width;
        
        // 4. 设置UIScrollView的contentOffset等于新的偏移的值
        [self.scrollView setContentOffset:CGPointMake(offsetX, 0) animated:YES];
        
        
        // 如果图片现在已经滚动到最后一页了, 那么就滚动到第一页
        
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end
  • 相关阅读:
    资源汇总 | 墨天轮2021年数据库技术直播回顾
    2022年1月国产数据库大事记墨天轮
    墨天轮2021年度中国数据库魔力象限
    国产数据库考试资料汇总(持续更新)
    mongodb关机重启
    python pandas csv 大文件 DataFrame转换为List
    2021MongoDB中文社区年度表彰 | 星汉灿烂,感谢有你
    【网络研讨会】“专家面对面”MongoDB模式设计
    Centos7更换阿里云镜像
    jdbc中mysql多条SQL批量操作(CRUD)
  • 原文地址:https://www.cnblogs.com/developer-wang/p/4527517.html
Copyright © 2020-2023  润新知