一、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__);
}