UIScrollView原理、属性、代理方法及有关功能实现(用纯代码方式)

一、UIScrollView实现原理

滚动原理:通过修改scrollview的bounds.origin。可以通过以下代码验证

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
    NSLog(@“frame:%@ *** bounds:%@ *** “,NSStringFromCGRect(self.scrollView.frame),NSStringFromCGRect(self.scrollView.bounds));
}

缩放原理:通过修改被缩放视图的transform



二、实现拖拽

1. 在屏幕上放一个UIScrollView
2. 再放一个UIImageView,里面设置一个大图片,然后Size To Fit Content
## 此时能够显示图片,但是不能滚动和缩放
3. 设置UIScrollView的contentSize为图片的尺寸
## 此时图片可以滚动了

*设置 contentSize 其实是在设置 UIScrollView 的滚动范围;不设置contentSize ,UIScrollView 就不知道滚动范围,自然就不能滚动

    // UIScrollView 设置滚动的关键代码
    // 设置scrollView的contentSize(内容尺寸)为图片框里图片的尺寸
    scrollView.contentSize = imageView.image.size;

三、实现缩放

设置UIScrollview的代理,实现代理方法,设置缩放比例,才能进行内容的缩放

1、首先要遵守代理协议

@interface ViewController ()<UIScrollViewDelegate>
2、设置代理

    scrollView.delegate = self;

3、设置缩放比

    scrollView.maximumZoomScale = 2.0;
    scrollView.minimumZoomScale = 0.2;

4、实现代理方法,告诉UIScrollView要缩放哪一个视图(替 UIScrollView 找出需要缩放的视图)

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{
    return _redView;
}

四、常用的方法

    // 设置contentOffset,可以修改scrollView的滚动位置,并且通过animated参数,可以以动画的方式滚动
    [self.scrollView setContentOffset:CGPointMake(400, 300) animated:YES];
    
    // 调用 scrollRectToVisible: 可以让scrollView移动化的方式滚动到一个区域,这个区域一旦显示出来,就停止滚动
    [self.scrollView scrollRectToVisible:CGRectMake(400, 600, 100, 100) animated:YES];
    
    // 调用 setZoomScale: 可以以动画的方式自动实现缩放
    [self.scrollView setZoomScale:0.5 animated:YES];

    // contentInset:在contentSize的基础上增加的额外的滚动范围
    scrollView.contentInset = UIEdgeInsetsMake(20, 40, 60, 80);

五、常用属性

    //1. 滚动内容属性
    //The point at which the origin of the content view is offset from the origin of the scroll view.
    //内容视图的原点 与 UIScrollView 的 原点 的偏移量
    @property(nonatomic) CGPoint contentOffset;
    
    //The size of the content view.
    //滚动视图的尺寸
    2. @property(nonatomic) CGSize contentSize;
    
    //The distance that the content view is inset from the enclosing scroll view.
    //内容视图四周附加的滚动举例
    3. @property(nonatomic) UIEdgeInsets contentInset;
    
    //是否可以滚动
    4. @property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;

六、常用的代理方法及调用的顺序

//返回一个要被缩放的视图,如果delegate为nil,将什么也不发生
//return a view that will be scaled. if delegate returns nil, nothing happens
-(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return _imageView;
}

//以下是拖拽时调用的方法,
//1、开始拖拽时调用
-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    NSLog(@"%s",__func__);
}

//2、滚动中实时调用
-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    NSLog(@"%s",__func__);
}

//3、即将松开拖拽时调用
-(void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
    NSLog(@"%s",__func__);
}

//4、结束拖拽时调用
-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
    NSLog(@"%s",__func__);
}

//5、松开拖拽时 即将开始减速,调用此方法
-(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"%s",__func__);
}

//6、已经减速 停止滚动时调用
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    NSLog(@"%s",__func__);
}


//以下是缩放时调用的方法
//1、开始缩放时调用
-(void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view
{
    NSLog(@"%s",__func__);
}
//2、缩放过程中,实时调用此方法和scrollViewDidScroll
-(void)scrollViewDidZoom:(UIScrollView *)scrollView
{
    NSLog(@"%s",__func__);
}

//3、结束缩放时调用
-(void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale
{
    NSLog(@"%s",__func__);
}

//当scrollView的scrollsToTop属性设置为YES时,点击状态栏,立即滚动到顶部
//调用顺序是
//1、调用scrollViewShouldScrollToTop
-(BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView
{
    NSLog(@"%s",__func__);
    return YES;
}

//2、scrollViewDidScroll

//3、scrollViewDidScrollToTop,已经滚动到顶部
-(void)scrollViewDidScrollToTop:(UIScrollView *)scrollView
{
    NSLog(@"%s",__func__);
}














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值