ScrollView详解创建⽅式1:StoryBoard/Xib这⾥StoarBoard就不多说,直接拖就可以,说太多没意思,如果连这个都不会我只能先给你跪了!2:代码:1 2 3CGRect bounds = [ [ UIScreen mainScreen ] applicationFrame ] ;UIScrollView* scrollView = [ [UIScrollView alloc ] initWithFrame:bounds ];1. 当你创建完滚动视图后,你可以将另⼀个视图的内容粘合到滚动视图的空⽩页上。
这回创建⼀个滚动的内容窗⼝:1 [ scrollView addSubview:myView];UIScrollView使⽤的步骤1.创建UIScrollView2.将需要展⽰的内容添加到UIScrollView中3.设置UIScrollView的滚动范围 (contentSize)基本属性scrollView不能滚动的⼏种情况1.没有设置contentSize2.scrollEnabled属性 = NOerInteractionEnabled属性 = NOself.scrollView.scrollEnabled = NO;erInteractionEnabled = NO;enabled和userInteractionEnabled的区别enabled: 代表控件不可⽤userInteractionEnabled: 代表控件不可以和⽤户交互, 也就是不能响应⽤户的操作注意: 如果想让UIScrollView进⾏滚动, 必须设置可以滚动的范围注意: 如果想让UIScrollView进⾏滚动, 必须设置可以滚动的范围设置scrollView的滚动范围为, frame的宽⾼ + 100self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width + 100, self.scrollView.frame.size.height + 100);2.设置滚动范围self.scrollView.contentSize = iv.image.size;// 如何去掉滚动条self.scrollView.showsHorizontalScrollIndicator = NO;self.scrollView.showsVerticalScrollIndicator = NO;滚动条也是scrollView的⼦控件的⼀部分滚动条可能在⼦控件的前⾯, 也可能在⼦控件的后⾯正是因为这个原始, 所以以后在开发中不推荐⼤家通过subviews获取⼦控件的⽅式来操作⼦控件[self.scrollView.subviews lastObject];设置滚动条的样式self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;默认情况下UIScrollView有⼀个回弹效果只要设置了contentSize就有回弹效果self.scrollView.bounces = YES;设置默认是否有回弹效果 (默认就是没有设置contentSize的情况)垂直⽅向可以回弹下拉刷新哪怕没有设置contentSize也可以有回弹效果self.scrollView.alwaysBounceVertical = YES;self.scrollView.alwaysBounceHorizontal = YES;3.设置边距self.scrollView.contentInset = UIEdgeInsetsMake(10, 20, 30, 40);注意点:contentOffset移动的位置是⼀个临时的位置, 只要轻轻拖拽⼀下就会回到默认的位置CGFloat offsetX = self.sc.contentSize.width - self.sc.frame.size.width;CGFloat offsetY = self.sc.contentSize.height - self.sc.frame.size.height;[self.sc setContentOffset:CGPointMake(offsetX, offsetY) animated:YES];-----------------------代理:----------------------------如何监听⼀个控件的变化/状态1. ⾸先需要查看该控件的头⽂件, 看它继承于谁1.1如果继承于UIControl, 那么就可以通过addTarget来监听1.2如果继承于UIView, 那么必须通过代理来监听——————————————————————————————————————————————————————代理协议的规律:以控件的类名开头, 后⾯加上delegate代理协议中的⽅法名的规律:⼀般以控件名称去掉类前缀开头代理协议中的⽅法参数的规律:谁触发事件, 就将谁传递进来如何监听UIScrollView的变化1.成为UIScrollView的代理2.遵守UIScrollView的协议3.实现UIScrollView协议中的⽅法代理作⽤:当A对象想监听B对象的变化 , 那么可以让A成为B的代理当B对象发⽣⼀些变化想通知A对象, 那么可以让A成为B的代理/**************************代理⽅法***********************************/#pragma mark - UIScrollViewDelegate// 只要成为了UIScrollView的代理, 遵守代理协议, 实现协议中的⽅法// 当UIScrollView发⽣⼀些变化的时候, 系统就会⾃动调⽤这些代理⽅法// scrollViewDidScroll⽅法什么时候调⽤?// 只要UIScrollView滚动了, 系统就会⾃动调⽤1 - (void)scrollViewDidScroll:(UIScrollView *)scrollView23 {45 NSLog(@"%@", NSStringFromCGPoint(self.sc.contentOffset));67 }891011 // 只要⽤户准备开始拖拽了就会调⽤1213 - (void)scrollViewWillBeginDragging:(nonnull UIScrollView *)scrollView1415 {1617 }// ⽤户已经结束拖拽, 代表⽤户已经松⼿了// 系统调⽤了该⽅法并不代表着,UIScrollView已经停⽌滚动了// 每次调⽤停⽌拖拽⽅法时 ,系统都会传⼊⼀个当前是否有惯性的参数// 我们可以判断该参数是否为YES, 如果是YES代表当前UIScrollView有惯性, 停⽌拖拽并不会停⽌滚动, 需要在停⽌减速⽅法中监听什么时候真正的停⽌1 - (void)scrollViewDidEndDragging:(nonnull UIScrollView *)scrollView willDecelerate:(BOOL)decelerate23 {45 NSLog(@"decelerate = %i", decelerate);67 if (decelerate == NO) {89 NSLog(@"没有惯性, 可以在当前⽅法监听UIScrollView是否停⽌滚动");1011 [self scrollViewDidEndDecelerating:scrollView];1213 }else{1415 NSLog(@"有惯性, 需要在减速结束⽅法中监听UIScrollView是否停⽌滚动");1617 }1819 }2021 // UIScrollView已经停⽌减速了2223 // 只有执⾏了这个⽅法才代表UIScrollView已经停⽌滚动了2425 - (void)scrollViewDidEndDecelerating:(nonnull UIScrollView *)scrollView2627 {2829 NSLog(@"UIScrollView停⽌滚动了");3031 }结合前⾯MVC中的九宫格案例使⽤UIScrollView实现,并且设置滚动到对应的位置: //6.设置shopsView的滚动范围1 //添加滚动范围23 if (self.row > 2) {45 self.shopsView.contentSize = CGSizeMake(0, (self.row + 1) * (shopHeight + RowMargin));67 //开始滚动891011 CGPoint offset = CGPointMake(0, (self.row - 2) * (shopHeight + RowMargin));1213 [self.shopsView setContentOffset:offset animated:YES];1415 }注意:如果想在UIScrollView停⽌滚动之后做⼀些操作, 有两种情况1.没有惯性的情况: 只会调⽤停⽌拖拽的⽅法, 不会调⽤停⽌减速的⽅法2.有惯性的情况: 既会调⽤停⽌拖拽的⽅法, 也会调⽤停⽌减速的⽅法所以: 以后要判断UIScrollView是否停⽌滚动, 需要同时重写两个⽅法2.1scrollViewDidEndDragging2.2scrollViewDidEndDecelerating缩放:要想缩放图⽚分为两步1.成为代理, 通过代理⽅法告诉UIScrollView要缩放哪⼀个⼦控件2.设最⼤置⼦控件和最⼩的缩放⽐例}// 因为UISrollView中可能有多个⼦控件// 那么UISrollView就搞不清楚到底要缩放哪⼀个⼦控件// 想要缩放, 必须明确的告诉UISrollView要缩放哪⼀个控件/**************************缩放代理⽅法***********************************/#pragma mark - UIScrollViewDelegate1 // 在此⽅法中告诉UISrollView要缩放哪⼀个控件3 - (nullable UIView *)viewForZoomingInScrollView:(nonnull UIScrollView *)scrollView45 {67 return self.iv;89 }1011 // 缩放的过程中调⽤1213 // 和上午学习的scrollViewDidScroll⼀样, 只要缩放⼀点点就会调⽤1415 - (void)scrollViewDidZoom:(nonnull UIScrollView *)scrollView1617 {1819 NSLog(@"%s", __func__);2021 }2223 // 缩放结束时调⽤2425 - (void)scrollViewDidEndZooming:(nonnull UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale2627 {2829 NSLog(@"%s", __func__);3031 }综合案例:在iOS开发中UIScrollView使⽤最多的地⽅也就是结合pageControl实现页⾯的轮播,⽐如新特性或者⼴告还有⼀些就是关于图⽚浏览什么的。