IOS:个人笔记|UI_UIScrollView基本属性设置,代理方法,图片缩放
UIScrollView是一个滚动的View.
clipsToBounds,超出边框的视图会裁剪掉,默认是YES。
contentSize,内容区域的尺寸,如果contentSize尺寸小于或者等于ScrollView的尺寸,那么不能滚动
例如srcollview的size是(400,400),contentSize是(401,401)。可以滚动的距离XY都为1,实际情况滚动会有一种”弹簧“的效果,松开手会回到正常滚动的地方。
UIScrollView无法滚动的一些常见 的原因
1:没有设置contentSize或者设置的小于scrollview的尺寸
2:scrollEnabled(默认是YES)被改为NO了
3:userInteractionEnable,用户交互行为设为NO了
下面是最基本的一些实现
1 UIImage *image=[UIImage imageNamed:@"timg.jpg"]; 2 CGFloat w=image.size.width; 3 CGFloat h=image.size.height; 4 UIImageView *imageView=[[UIImageView alloc]init]; 5 imageView.frame=CGRectMake(0, 0, w, h); 6 imageView.image=image; 7 UIScrollView *scrollView=[[UIScrollView alloc]init]; 8 scrollView.frame=CGRectMake(10, 60, 200, 200); 9 10 scrollView.contentSize=CGSizeMake(w, h); 11 [scrollView addSubview:imageView]; 12 13 [self.view addSubview:scrollView];
===============================================
常见的属性
1:bounces弹簧效果
2:alwaysBouncesHorizonal
alwaysBouncesVertical
上面这两个属性,如果在已经设置了contentSize的 情况下,无论设置为Yes,还是NO,都会有弹簧效果。如果在没有设置contensize的时候,是不会滑动的。但设置了这两个属性,就有弹簧的效果(注意因为没设置contentsize,仍然不能滑动,只是有拉动的弹簧效果),可以配合着下拉刷新的场景使用
1 -(void)setUIScrollView{ 2 //图片大小为240*240 3 UIImage *image=[UIImage imageNamed:@"timg.jpg"]; 4 CGFloat w=image.size.width; 5 CGFloat h=image.size.height; 6 UIImageView *imageView=[[UIImageView alloc]init]; 7 imageView.frame=CGRectMake(0, 0, w, h); 8 imageView.image=image; 9 UIScrollView *scrollView=[[UIScrollView alloc]init]; 10 scrollView.frame=CGRectMake(10, 60, 200, 200); 11 // scrollView.contentSize=CGSizeMake(w, h); 12 [scrollView addSubview:imageView]; 13 [self.view addSubview:scrollView]; 14 //弹簧效果 15 // scrollView.bounces=NO; 16 scrollView.alwaysBounceVertical=YES; 17 scrollView.alwaysBounceHorizontal=YES; 18 //上面设置了竖直下拉为YES,然后转圈的位置设定在scrollView的X轴上方,然后下拉,转圈就出来了。实际中常用在下拉刷新场景 19 UIActivityIndicatorView *indicator=[[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray]; 20 indicator.center=CGPointMake(100, -40); 21 [indicator startAnimating]; 22 [scrollView addSubview:indicator]; 23 }
=========================================
showVerticalScrollIndicator
showHorizonalScrollerIndicator
是否显示滚动条,默认是YES
==========================================
contentOffset,内容区域的偏移,可以用来获取实时滑动中滑动的距离。我们可以在屏幕点击事件touchBegan中
写这个实时打印下
注意此处用的是屏幕点击事件中打印偏移量,拖拉趁图片没回原位的时候快速点击看下结果。为了方便观察写在scrollView的代理方法中比较好
1 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 2 { 3 4 NSLog(@"====偏移量X:%f----Y:%f",_scrollView.contentOffset.x,_scrollView.contentOffset.y); 5 }
==========================================================
contentInset 内边距。
ScrollView.contentInset=UIEdgeInsetsMake(20,20,20,20);
下拉后不会回到原位置,演示如下图。
====================================================
UIScrollview常见的代理方法
首先,在设置scrollview基本属性的时候,最后加上一句scrollview.delegate=self;
注意:任何对象都i可以成为scrollView的代理,只是一般情况用self控制器本身
代理是弱指针,设置代理对象的时候,需要注意强弱
1 - (void)scrollViewDidScroll:(UIScrollView *)scrollView 2 { 3 NSLog(@"正在滚动"); 4 } 5 - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView 6 { 7 NSLog(@"要开时拖拽"); 8 } 9 - (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset{ 10 NSLog(@"即将停止拖拽"); 11 12 } 13 - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ 14 if(decelerate) 15 {NSLog(@"已停止拖拽,由于惯性继续滚动");} 16 else 17 {NSLog(@"已停止拖债,停止关东");} 18 } 19 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 20 { 21 NSLog(@"减速完毕停止滚动"); 22 }
这些代理方法比较好理解,基本上能做到见名知义。拖动图片看看代理方法的打印输出情况,基本就知道了什么时候会触发。
=========================================================
内容缩放
先设置scrollview的两个属性,max/minmumZoomScale,放大倍数和缩小倍数。然后实现代理方法,viewforZominginScrollView.
scrollViewDidZoom,监听放大缩小事件,最后返回对象是imageview
在模拟器上运行的时候
alt+鼠标左键,手势按钮反向运动
alt+shirt+鼠标左键,手势按钮同向运动