zoukankan      html  css  js  c++  java
  • 你真的了解UIScrollView吗?

    一:首先查看一下关于UIScrollView的定义

    NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding>
    
    //表示UIScrollView滚动的位置(就是内容左上角与scrollView左上角的间距!!)
    @property(nonatomic)         CGPoint                      contentOffset;                  // default CGPointZero
    //表示UIScrollView内容的尺寸,滚动范围
    @property(nonatomic)         CGSize                       contentSize;                    // default CGSizeZero
    //在UIScrollView的四周增加额外的滚动区域,一般用来避免scrollView的内容被其他控件挡住
    @property(nonatomic)         UIEdgeInsets                 contentInset;            
    //委托       
    @property(nullable,nonatomic,weak) id<UIScrollViewDelegate>        delegate;                       // default nil. weak reference
    //设置当向一个方向滚动的时候,是否锁住向另外一个方向的滚动
    @property(nonatomic,getter=isDirectionalLockEnabled) BOOL directionalLockEnabled;         // 默认值为 NO
    //设置UIScrollView是否需要弹簧效果
    @property(nonatomic)         BOOL                         bounces;                        // 默认值YES
    
    //是否一直有弹簧效果: 使用范围 ContentSize.height < ScrollView.height 的情况下垂直方向默认情况下是没有弹簧效果的, 但是设置了AlwaysBounceVertical = YES的时候就会让在这种情况下仍然有弹簧效果
    @property(nonatomic)         BOOL                         alwaysBounceVertical;           // 默认值 NO
    @property(nonatomic)         BOOL                         alwaysBounceHorizontal;         // 默认值 NO
    
    //控制控件是否整页翻动 默认值为NO
    @property(nonatomic,getter=isPagingEnabled) BOOL          pagingEnabled;                 
    //设置UIScrollView是否能滚动
    @property(nonatomic,getter=isScrollEnabled) BOOL          scrollEnabled;                  //默认值 YES
    //是否显示水平滚动条
    @property(nonatomic)         BOOL                         showsHorizontalScrollIndicator; // 默认值YES
    //是否显示垂直滚动条
    @property(nonatomic)         BOOL                         showsVerticalScrollIndicator;   // 默认值YES
    
    //设置滚动条到scrollView上左下右的边距,只有下和右有效
    // 参数1: 设置x值无效
    // 参数2: 设置y值无效
    // 参数3: 设置下面的距离
    // 参数4: 设置右边的距离
    @property(nonatomic)         UIEdgeInsets                 scrollIndicatorInsets;  
    
    // 设置滚动条的风格
    // .Default  (默认)灰色
    // .Black    黑色的滚动条
    // .Whitr    白色的滚动条        
    @property(nonatomic)         UIScrollViewIndicatorStyle   indicatorStyle;                 // 默认值 UIScrollViewIndicatorStyleDefault
    
    // // 设置手指放开后的减速率
    @property(nonatomic)         CGFloat                      decelerationRate NS_AVAILABLE_IOS(3_0);
    
    //意思是需要动画 但是时间是苹果自己定义的第一个参数是你要滚动到的位置 第二个参数是是否要动画效果!
    - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; 
    
    - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;         // scroll so rect is just visible (nearest edges). nothing if rect completely visible
    
    //短暂的显示一下状态条,当你将scrollView调整到最上面时,需要调用一下该方法
    - (void)flashScrollIndicators;         
    
    //只读,一旦用户开始触摸视图(也许还没有开始拖动),该属性值为YES
    @property(nonatomic,readonly,getter=isTracking)     BOOL tracking;        
    //只读,当用户开始拖动(手指已经在屏幕上滑动一段距离了),该属性值为YES
    @property(nonatomic,readonly,getter=isDragging)     BOOL dragging;        
    //只读,当用户松开手指,但视图仍在滚动时,该值返回YES
    @property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;    
    
    //是否推迟触屏手势处理,默认值为YES。设置为YES的时候,系统在确定是否发生scroll事件之后,才会处理触屏手势,否则,则会立即调用touchesShouldBegin:withEvent:inContentView:方法
    @property(nonatomic) BOOL delaysContentTouches;      
    
    //假如你设置canCancelContentTouches为YES,那么当你在UIScrollView上面放置任何子视图的时候,当你在子视图上移动手指的时候,UIScrollView会给子视图发送touchCancel的消息。而如果该属性设置为NO,ScrollView本身不处理这个消息,全部交给子视图处理 默认值YES
    @property(nonatomic) BOOL canCancelContentTouches;    
    
    //如果返回值为 yes , touch 事件传给子视图;如果为 no , touch 事件不传给子视图
    - (BOOL)touchesShouldBegin:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event inContentView:(UIView *)view;
    
    - (BOOL)touchesShouldCancelInContentView:(UIView *)view;
    
    // 设置最小的缩放倍数,默认值1.0
    @property(nonatomic) CGFloat minimumZoomScale; 
    // 设置最大缩放倍数,默认值1.0
    @property(nonatomic) CGFloat maximumZoomScale; 
    
    // 当前的缩放倍数
    @property(nonatomic) CGFloat zoomScale NS_AVAILABLE_IOS(3_0);            // 默认值 1.0
    
    //程序设置缩放大小
    - (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);
    //将内容视图缩放到指定的Rect中
    - (void)zoomToRect:(CGRect)rect animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);
    
    //控制缩放的时候是否会反弹 默认值YES
    @property(nonatomic) BOOL  bouncesZoom;          // default is YES. if set, user can go past min/max zoom while gesturing and the zoom will animate to the min/max value at gesture end
    
    //只读,用户是否正在进行缩放手势
    @property(nonatomic,readonly,getter=isZooming)       BOOL zooming;      
    //只读,当缩放超过最大或者最小范围的时候,回弹到最大最小范围的过程中,该值返回YES。
    @property(nonatomic,readonly,getter=isZoomBouncing)  BOOL zoomBouncing;  
    
    //设置是否可以自动滚动到顶部(点击上面状态栏的时候),默认为true
    @property(nonatomic) BOOL  scrollsToTop;   
    
    //移动手势   只读
    @property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer NS_AVAILABLE_IOS(5_0);
    
    // 缩放手势   只读
    @property(nullable, nonatomic, readonly) UIPinchGestureRecognizer *pinchGestureRecognizer NS_AVAILABLE_IOS(5_0);
    
    //当拖动发生时,键盘的消失模式,默认值是不消失UIScrollViewKeyboardDismissModeNone
    @property(nonatomic) UIScrollViewKeyboardDismissMode keyboardDismissMode NS_AVAILABLE_IOS(7_0);
    
    @end

    UIScrollView用于显示超出屏幕大小内容,一般需要配合其他控件来使用,如添加一个UIImageView子控件,可以用来显示更大的图片;

    UITableView、UICollectionView以及UITextView这些可以滑动显示更多内容的控件,都是UIScrollView的子类;

    知识点1关于UIScrollView的各个大小说明

     

    知识点2:如果UIScrollView无法滚动,可能是以下原因:

    1:没有设置contentSize
    2:scrollEnabled = NO
    3:没有接收到触摸事件:userInteractionEnabled = NO

     知识点3:iOS7以后,导航控制器会为其中的scrollView的顶部自动添加64的内边距,如果想去掉,可以通过下列属性去掉

    self.automaticallyAdjustsScrollViewInsets = NO;

    知识点4UIScrollView实现滑动视图实例

    //---导入代理
    @interface RootViewController ()<UIScrollViewDelegate>
    
    @end
    
    @implementation RootViewController
    
    //viewDidLoad只执行一次
    - (void)viewDidLoad {
    
        [super viewDidLoad];
        self.view.backgroundColor = [UIColor yellowColor];
    
        //-创建滚动视图  当我们需要显示的内容超过一屏时,就需要用到滚动视图
        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
        [scrollView setBackgroundColor:[UIColor orangeColor]];
        [self.view addSubview:scrollView];
    
        //-Key:设置滚动区域(内容区域的大小)
        scrollView.contentSize = CGSizeMake(CGRectGetWidth(self.view.frame) * 4, CGRectGetHeight(self.view.frame));
        //-为scrollview添加子视图
    //    NSArray *colorArr = [NSArray arrayWithObjects:[UIColor cyanColor], [UIColor greenColor],  [UIColor redColor], [UIColor blueColor], nil];
        NSArray *imageArr = [NSArray arrayWithObjects:[UIImage imageNamed: @"woman1.jpg"], [UIImage imageNamed: @"woman2.jpg"], [UIImage imageNamed: @"woman3.jpg"], [UIImage imageNamed:@"woman4.jpg"],  nil];
    
        for (int i = 0; i < 4; i++) {
    
            UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(CGRectGetWidth(self.view.frame)*i, 0, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame))];
            label.text = [NSString stringWithFormat:@"这是志南的第%d夫人", i+1];
            label.font = [UIFont systemFontOfSize:30];
            label.textAlignment = NSTextAlignmentCenter;
    //        label.backgroundColor = colorArr[i];//
    
            UIImageView *imageView = [[UIImageView alloc] initWithImage:imageArr[i]];
            imageView.frame = CGRectMake(CGRectGetWidth(self.view.frame)*i, 0, CGRectGetWidth(self.view.frame), CGRectGetHeight(self.view.frame));
    
            [scrollView addSubview:imageView];
            [scrollView addSubview:label];
        }
    
        //--设置分页效果
        scrollView.pagingEnabled = YES;
        //--设置横向滚动条是否显示 默认值为YES
        scrollView.showsHorizontalScrollIndicator = YES;
        //----------------------设置滚动条样式
    
        //--设置边界是否有反弹效果 默认值为YES
        scrollView.bounces = NO;
    
        //---设置代理
        scrollView.delegate = self;
    }
    
    #pragma mark -- 滚动视图的代理方法
    //将要开始拖拽(手指触碰到屏幕,并且移动)
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
        NSLog(@"---%s", __func__);
    }
    
    //已经开始滚动(只要scrollview是滚动状态就会调用此方法)
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    
        //------滚动视图上面的子视图可以移动,不是子视图改变自身的frame值,而是,通过改变更改滚动视图(也就是子视图的父视图)的bounds的origin(也就是x,y)来更改子视图在父视图(滚动视图)上显示的位置
    
        //scrollview的偏移量
        CGPoint offSet = scrollView.contentOffset;
        NSLog(@"----%s", __func__);
        //得到scrollView的bounds的x点,即水平方向偏移量
        NSLog(@"偏移量-----%f", offSet.x);
        float x = scrollView.bounds.origin.x;
        NSLog(@"bounds------%f", x);
        /*------【回顾】:bounds改变导致其子视图位置改变!!!
         改变子视图位置:scrollView滚动视图通过改变自身bounds,子view左上角坐标原点发生移动*/
    }
    
    //停止拖动(当手指(触摸对象)离开,正在滚动的视图减速)
    - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView{
        NSLog(@"--%s", __func__);
    }
    
    //视图真正静止(视图不动了)
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
        NSLog(@"%s",__func__);
    }
    
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    @end

    知识点5UIScrollView和UIPageControl配合使用

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    // Do any additional setup after loading the view.
    
        // 设置背景色
        self.view.backgroundColor = [UIColor grayColor];
    
        // 添加UIScrollView
        self.userGuideScrollView = [[[UIScrollView alloc] initWithFrame:CGRectMake(0,0, self.view.frame.size.width, self.view.frame.size.height)] autorelease]; // 初始化位置和大小
        self.userGuideScrollView.contentSize = CGSizeMake(self.view.frame.size.width* 11, self.view.frame.size.height); // 设置存放的内容的大小
        _userGuideScrollView.pagingEnabled = YES; // 设置scrollView按一整页滑动
        _userGuideScrollView.delegate = self; // 设置代理为当前
        _userGuideScrollView.userInteractionEnabled = YES; // 设置可以与用户交互
        _userGuideScrollView.showsHorizontalScrollIndicator = YES; // 显示滑动时候横向的滚动条
        // 添加图片到UIScrollView中
        for (int i = 1; i <= 11; i++) {
            UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImageimageNamed:[NSString stringWithFormat:@"image%d", i]]];
            imageView.frame = CGRectMake((i - 1) * self.view.frame.size.width, 0,self.view.frame.size.width, self.view.frame.size.height);
            [_userGuideScrollView addSubview:imageView];
            [imageView release], imageView = nil;
        }
        // 添加到当前的View
        [self.view addSubview:_userGuideScrollView];
    
    
        // 初始化UIPageController
        self.scrollPageControl = [[[UIPageControl alloc] init] autorelease];
        _scrollPageControl.frame = CGRectMake(0, self.view.frame.size.height - 60,self.view.frame.size.width, 30); // 设置位置
        _scrollPageControl.numberOfPages = 11; // 设置有多少个小点点
        _scrollPageControl.currentPage = 0; // 设置当前是哪个点点
        _scrollPageControl.pageIndicatorTintColor = [UIColor blueColor]; // 没有选中的点点的颜色
        _scrollPageControl.currentPageIndicatorTintColor = [UIColor yellowColor]; //当前点点的颜色
        [_scrollPageControl addTarget:self action:@selector(scrollPageControlAction:)forControlEvents:UIControlEventValueChanged]; // 设置监听事件
        _scrollPageControl.highlighted = YES;
        [self.view addSubview:_scrollPageControl];
    
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    
    #pragma mark - 实现---scrollPageControlAction:监听事件
    - (void)scrollPageControlAction:(UIPageControl *) sender {
        //令UIScrollView做出相应的滑动显示
        CGSize viewSize = _userGuideScrollView.frame.size;
        CGRect rect = CGRectMake(sender.currentPage * viewSize.width, 0, viewSize.width, viewSize.height);
        [_userGuideScrollView scrollRectToVisible:rect animated:YES];
    }
    
    
    #pragma mark - 重写----scrollViewDelegate中的代理方法 实现滑动
    -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
        // 计算偏移量
        int index = abs(scrollView.contentOffset.x / scrollView.frame.size.width);
        // 根据偏移量来设置pageControl
        _scrollPageControl.currentPage = index;
    }
    
    
    #pragma mark - 重写----dealloc方法
    - (void)dealloc {
        // 释放属性的内存
        _scrollPageControl = nil;
        _userGuideScrollView = nil;
    }

    二:UIScrollView的代理UIScrollViewDelegate

    @protocol UIScrollViewDelegate<NSObject>
    
    @optional
    
    //只要滚动了就会触发 
    - (void)scrollViewDidScroll:(UIScrollView *)scrollView;                                               
    //缩放过程中不断调用该方法
    - (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2); 
    
    //开始拖拽视图 调用该方法
    - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
    //将要完成拖拽调用该方法
    - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);
    
    //完成拖拽调用该方法
    - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
    
    //将开始降速时调用该方法
    - (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;  
    //减速停止了时执行,手触摸时执行 
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;      
    
    //滚动动画停止时执行,代码改变时出发,也就是setContentOffset改变时 
    - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
    
    //设置放大缩小的视图,要是uiscrollview的subview  
    - (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;   
     
    // 即将开始缩放时调用
    - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view NS_AVAILABLE_IOS(3_2); 
    
    //完成放大缩小时调用
    - (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale;
    
    //如果你不是完全滚动到滚轴视图的顶部,你可以轻点状态栏,那个可视的滚轴视图会一直滚动到顶部,那是默认行为,你可以通过该方法返回NO来关闭它  
    - (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;  
    
    //已滚动顶部调用此方法
    - (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;     
    
    @end

    知识点1:控件悬停效果;当scrollView往上拖拽到某一个位置的时候,控件(testView)悬停到某一个位置,当scrollView往下拉的时候,该控件(testView)又随着scrollView一起移动;

    实现思路:当往上拖拽到一定位置的时候(通过计算偏移量来判断),让该控件(testView)添加到self.view上,并设置该控件(testView)的frame固定到该位置,当scrollView再次往回拖拽到该位置的时候,再让该控件(testView)再添加到scrollView上,成为scrollView的子控件

    知识点2:顶部图片下拉放大效果;当scrollView往下拖拽的时候,让顶部的imageView按比例放大

    实现思路:当scrollView往下拖拽的时候,通过偏移量来修改顶部imageView的transform(缩放的transform)

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView
    {
        CGFloat imageH = self.imageView.frame.size.height;
        CGFloat offsetY = scrollView.contentOffset.y;
        // 该判断是实现scrollView内部的子控件悬停效果
        if (offsetY >= imageH) {
            // 将红色控件添加到控制器的view中,设置Y值为0
            CGRect redF = self.redView.frame;
            redF.origin.y = 0;
            self.redView.frame = redF;
            [self.view addSubview:self.redView];
        }else{
            // 将红色控件添加到scrollView中,设置Y值为图片的高度
            CGRect redF = self.redView.frame;
            redF.origin.y = 140;
            self.redView.frame = redF;
            [self.scrollView addSubview:self.redView];
        }
    
        // 实现下拉放大顶部图片效果
        CGFloat scale = 1 - (offsetY / 70);
        scale = (scale >= 1) ? scale : 1;
        self.imageView.transform = CGAffineTransformMakeScale(scale, scale);
    }

    知识点3:网上关于UIScrollView的循环播放及缩放功能的实例

    //宏定义屏幕的宽和高
    #define ScreenWight [UIScreen mainScreen].bounds.size.width
    #define ScreenHeight [UIScreen mainScreen].bounds.size.height
    @interface ViewController ()<UIScrollViewDelegate>//签滚动视图协议,为了实现协议方法
    /** 滚动视图属性 */
    @property(nonatomic, retain)UIScrollView *scrollView;
    /** 分页控件属性 */
    @property(nonatomic, retain)UIPageControl *pageControl;
    /** 标记属性 */
    @property(nonatomic, assign)BOOL flag;
    @end
    - (void)loadView
    {
        [super loadView];
        self.scrollView = [[UIScrollView alloc] initWithFrame:self.view.frame];
        //设置容量
        self.scrollView.contentSize = CGSizeMake(8 * ScreenWight, ScreenHeight);
        //添加滚动视图
        [self.view addSubview:_scrollView];
        //设置整页翻动
        self.scrollView.pagingEnabled = YES;
        //设置偏移量
        self.scrollView.contentOffset = CGPointMake(ScreenWight, 0);
        //设置代理人
        self.scrollView.delegate = self;
        for (NSInteger i = 1; i < 7; i++) {
            //创建小的滚动视图
            /**
              为什么要创建小的滚动视图?
              因为在进行缩放之后发现,之前的滚动效果发生了变化,
              原因在于当我们进行缩放的时候,协议方法不但会改变视图的尺存,同样也可以改变scrollView的contenSize属性。
              解决方法:大的scrollView上先铺设小的scrollView ,然后把imageView放到小的scrollView上
              大的scrollView主要承担水平或垂直滚动,小的scrollView承担缩放的功能,
              并且每个都设置好缩放比例,这样再进行缩放,只会改变小scrollView的contenSize, 不会改变scrollView的contentSize。
             */
            UIScrollView *tempScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(ScreenWight * i, 0, ScreenWight, ScreenHeight)];
            tempScrollView.contentSize = CGSizeMake(ScreenWight, ScreenHeight);
            //隐藏底部和右侧滚动条
            tempScrollView.showsVerticalScrollIndicator = NO;
            tempScrollView.showsHorizontalScrollIndicator = NO;
            //设置缩放的比例
            tempScrollView.minimumZoomScale = 0.5f;
            tempScrollView.maximumZoomScale = 3.0f;
            //小滚动视图设置代理,为的是实现缩放的代理方法
            tempScrollView.delegate = self;
            [self.scrollView addSubview:tempScrollView];
    
            //循环往小滚动视图添加图片
            UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, ScreenWight, ScreenHeight)];
            NSString *imageName = [NSString stringWithFormat:@"%ld.JPG", i];
            imageView.image = [UIImage imageNamed:imageName];
            [tempScrollView addSubview:imageView];
           
    
            //设置轻拍手势
            //首先打开imageView的用户交互,默认是关闭
            imageView.userInteractionEnabled = YES;
            UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapImageView:)];
            tapGesture.numberOfTapsRequired = 2;
            [imageView addGestureRecognizer:tapGesture];
        }
    
        //在最前面加上最后一张图,障眼法,给人一种感觉从第一页循环回最后一页
        //在此刻改变滚动视图的偏移量
        UIScrollView *frontScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, ScreenWight, ScreenHeight)];
        frontScroll.contentSize = CGSizeMake(ScreenWight, ScreenHeight);
        [self.scrollView addSubview:frontScroll];
        UIImageView *frontImageView = [[UIImageView alloc] initWithFrame:self.view.frame];
        frontImageView.image = [UIImage imageNamed:@"6.JPG"];
        [frontScroll addSubview:frontImageView];
        //在最后面加上第一张图
        UIScrollView *lastScroll = [[UIScrollView alloc] initWithFrame:CGRectMake(7 * ScreenWight, 0, ScreenWight, ScreenHeight)];
        lastScroll.contentSize = CGSizeMake(ScreenWight, ScreenHeight);
        [self.scrollView addSubview:lastScroll];
        UIImageView *lastImageView = [[UIImageView alloc] initWithFrame:self.view.frame];
        lastImageView.image = [UIImage imageNamed:@"1.JPG"];
        [lastScroll addSubview:lastImageView];
    
        //分页控件
        self.pageControl = [[UIPageControl alloc] initWithFrame:CGRectMake(100, 600, 175, 30)];
        self.pageControl.numberOfPages = 6;
        [self.view addSubview:_pageControl];
    
        [self.pageControl addTarget:self action:@selector(didClickedPageControl:) forControlEvents:UIControlEventValueChanged];
    }
    #pragma mark 自定义方法,获取放大后显示的矩形区域
    - (CGRect)zoomRectByScale:(CGFloat)scale Center:(CGPoint)center
    {
        CGRect zoomRect;
        //求出新的长和宽
        zoomRect.size.width = ScreenWight / scale;
        zoomRect.size.height = ScreenHeight / scale;
    
        //找到新的原点
        zoomRect.origin.x = center.x * (1 - 1/scale);
        zoomRect.origin.y = center.y * (1 - 1/scale);
    
        return zoomRect;
    }
    #pragma mark 轻拍方法
    - (void)didTapImageView:(UITapGestureRecognizer *)tap
    {
        //这个是要获取当前点击的小滚动视图,而小滚动视图我们没有设置属性,无法在这儿获取
        //当前点击视图的父视图,其实就是当前点击的小滚动视图,就通过这种方法获取滚动视图对象
        UIScrollView *scroll = (UIScrollView *)tap.view.superview;
        if (_flag == NO) {
            CGRect newRect = [self zoomRectByScale:3.0 Center:[tap locationInView:tap.view]];
            //zoomToRect方法是UIScrollVie对象的方法,将图片相对放大
            [scroll zoomToRect:newRect animated:YES];
            _flag = YES;
        }else {
            [scroll setZoomScale:1 animated:YES];
            _flag = NO;
        }
    }
    #pragma mark 缩放的代理方法
    - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
    {
        //这个代理方法就是要返回一个view跟着scrollView缩放,
        //这个时候就会把scrollView的contentSize设置为imageView的大小
        //同时只能有一个view跟着scrollView缩放
        return scrollView.subviews.firstObject;
    }
    #pragma mark 滚动结束的代理方法
    - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
    {
        //滚动停止后,将每个小滚动视图比例还原
        for (UIScrollView *tempScroll in scrollView.subviews) {
            if ([tempScroll isKindOfClass:[UIScrollView class]]) {
                tempScroll.zoomScale = 1.0;
            }
        }
        //判断偏移量,并改变当前偏移量,实现循环播放功能
        if (scrollView.contentOffset.x == 0) {
            self.scrollView.contentOffset = CGPointMake(6 * ScreenWight, 0);
        }
        if (scrollView.contentOffset.x == ScreenWight * 7) {
            self.scrollView.contentOffset = CGPointMake(ScreenWight, 0);
        }
        //获取当前的页数,即滚动视图控制分页控件
        NSInteger pageNum = (long)(scrollView.contentOffset.x -  ScreenWight) / ScreenWight;
        //改变当前分页控件的显示页数
        self.pageControl.currentPage = pageNum;
    }
    #pragma mark 分页控件的触发方法
    - (void)didClickedPageControl:(UIPageControl *)pageControl
    {
        //根据当前点的下标,修改滚动视图应该显示的图片,即分页控件控制滚动视图
        CGPoint newPoint = CGPointMake((pageControl.currentPage + 1) * ScreenWight , 0);
        //修改滚动视图偏移量
        [self.scrollView setContentOffset:newPoint animated:YES];
    }

    三:UIScrollView中的枚举及常量

    1:UIScrollViewIndicatorStyle

    // 设置滚动条的风格
    // .Default  (默认)灰色
    // .Black    黑色的滚动条
    // .Whitr    白色的滚动条  
    typedef NS_ENUM(NSInteger, UIScrollViewIndicatorStyle) {
        UIScrollViewIndicatorStyleDefault,     
        UIScrollViewIndicatorStyleBlack,       
        UIScrollViewIndicatorStyleWhite       
    };

    2:UIScrollViewKeyboardDismissMode

    //self.scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;//刚拖动scrollView就隐藏键盘
    //self.scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;//从键盘上面点(scrollView未遮挡部分)向下滑动,键盘会跟着滑动;又往上滑动键盘也会跟着向上滑动
    //UIScrollViewKeyboardDismissModeNone//默认值,没有任何影响
    
    typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
        UIScrollViewKeyboardDismissModeNone,
        UIScrollViewKeyboardDismissModeOnDrag,      // dismisses the keyboard when a drag begins
        UIScrollViewKeyboardDismissModeInteractive, // the keyboard follows the dragging touch off screen, and may be pulled upward again to cancel the dismiss
    } NS_ENUM_AVAILABLE_IOS(7_0);

    3:decelerationRate属性

    //手指滑动后抬起,页面的减速速率。可以使用UIScrollViewDecelerationRateNormal和UIScrollViewDecelerationRateFast常量值来设置合理的减速速率。
    UIKIT_EXTERN const CGFloat UIScrollViewDecelerationRateNormal NS_AVAILABLE_IOS(3_0);
    UIKIT_EXTERN const CGFloat UIScrollViewDecelerationRateFast NS_AVAILABLE_IOS(3_0);

    最近有个妹子弄的一个关于扩大眼界跟内含的订阅号,每天都会更新一些深度内容,在这里如果你感兴趣也可以关注一下(嘿对美女跟知识感兴趣),当然可以关注后输入:github 会有我的微信号,如果有问题你也可以在那找到我;当然不感兴趣无视此信息;

  • 相关阅读:
    php+GTK2 学习第二篇
    PHPMailer + qq邮箱 实现邮件发送
    HTTP状态码200、301、403、404、500等(转)
    LNMP环境搭建(转载)
    PHP+GTK2 初体验,简单计算器客户端
    mysql 用户权限管理(转)
    提高php执行效率的10条编程习惯(转)
    添加php拓展(以phppcntl及phpredis及phppcntl为例)
    centos7 &后台运行 受终端关闭影响问题
    sklearn学习笔记之简单线性回归
  • 原文地址:https://www.cnblogs.com/wujy/p/5818866.html
Copyright © 2011-2022 走看看