iOS之旅--UIScrollView疑难处理
来源:互联网 发布:新疆教师网络培训登录 编辑:程序博客网 时间:2024/06/11 09:31
引子:前两天做了一个小活动,不是太赶周期,所以就不想采用xib和storyboard的方式开发,就使用Masonry控制约束,纯代码进行了开发。本次开发主要是使用UIScrollView。
当然,很快就把代码码完了,开始进入调试,突然发现scrollView不能滚动了,这里我已经设置过scrollView.contentSize了,但是还是不能滚动,然后就想到了可能是生命周期的问题,这里简单说一下生命周期的调用顺序
1、initWithNibName:bundle:
初始化UIViewController,执行关键数据初始化操作,注意这里不要做view相关操作,view在loadView方法中才初始化,这时loadView还未调用。如果使用StoryBoard进行视图管理,程序不会直接初始化一个UIViewController,StoryBoard会自动初始化或在segue被触发时自动初始化,因此方法initWithNibName:bundle:不会被调用。如果在代码里面使用instantiateViewControllerWithIdentifier:方法显示初始化一个UIViewController,则initWithCoder方法会被调用。如果是通过调用initWithNibName:bundle指定nib文件名初始化的话,ViewController会根据此nib来创建View。如果name参数为nil,则ViewController会通过以下两个步骤找到与其关联的nib: 1)如果ViewController的类名以“Controller”结尾,例如ViewController的类名是MyViewController,则查找是否存在MyView.nib; 2)找跟ViewController类名一样的文件,例如MyViewController,则查找是否存在MyViewController.nib2、loadView
当访问UIViewController的view属性时,view如果此时是nil,那么VC会自动调用loadView方法来初始化一个UIView并赋值给view属性。此方法用在初始化关键view,需要注意的是,在view初始化之前,不能先调用view的getter方法,否则将导致死循环(除非先调用了[supper loadView];)如果没有重载loadView方法,则UIViewController会从nib或StoryBoard中查找默认的loadView,默认的loadView会返回一个空白的UIView对象。3、viewDidLoad
当VC的view对象载入内存后调用,用于对view进行额外的初始化操作4、viewWillAppear
在view即将添加到视图层级中(显示给用户)且任意显示动画切换之前调用(这个时候supperView还是nil)。这个方法中完成任何与视图显示相关的任务,例如改变视图方向、状态栏方向、视图显示样式等
5、viewDidAppear
在view被添加到视图层级中,显示动画切换之后调用(这时view已经添加到supperView中)。在这个方法中执行视图显示相关附件任务,如果重载了这个方法,必须在方法中调用[supper viewDidAppear];6、viewWillLayoutSubviews
view即将布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),要调整Subviews的位置,在调整之前要做的一些工作就可以在该方法中实现。7、viewDidLayoutSubviews
view已经布局其Subviews。比如view的bounds改变了(例如状态栏从不显示到显示,视图方向变化),已经调整Subviews的位置,在调整完成之后要做的一些工作就可以在该方法中实现。8、viewWillDisappear
view即将从superView中移除且移除动画切换之前,此时还没有调用removeFromSuperview。9、viewDidDisappear
view从superView中移除,移除动画切换之后调用,此时已调用removeFromSuperview。
之前的代码全部在viewDidLoad里面,我把scrollView.contentSize 的设置放在viewDidLayoutSubviews(视图调整完的最后),这样就可以顺利的滑动了。
注:由于我这边的scrollView是动态的,需要计算高度,而我又不想保存过多的变量,所以不太想在viewDidLayoutSubviews里面设置scrollView的contentSize,所以就在视图添加完成之后做了如下操作:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [self.scrollView setContentSize:CGSizeMake(SCREEN_WIDTH, scrollHeight)]; });
通过这种办法也可以实现scrollView的正常滑动,不过没有特殊情况建议还是在viewDidLayoutSubviews里面去处理。
另外本次做的刮刮乐效果,使用到了UIScrollView的delaysContentTouches这个属性,很是有用。
如果你有遇到棘手的问题,欢迎留言。
阅读全文
0 0
- iOS之旅--UIScrollView疑难处理
- IOS之UIScrollView详解
- iOS UIScrollView之contentOffset
- iOS开发之UIScrollView
- iOS之UIScrollView详解
- IOS学习之UIScrollView
- 9.ios之UIScrollView
- iOS总结之UIScrollView
- iOS大典之UIScrollView
- iOS组件之UIScrollView
- IOS 之 UIScrollView,UIPageControl
- iOS之UIScrollView
- iOS UIScrollView之contentOffset
- iOS UIScrollView之contentOffset
- iOS之UISCrollView--原理
- IOS开发之UIScrollVIew运用
- ios 实战训练之UIScrollView
- 【IOS控件详解】之UIScrollView
- 数据结构
- C# SerialPort 使用DataReceived接口利用空闲中断原理接收完整一帧数据
- 一台电脑安装多个JDK,C:\Windows\System32 找不到java.exe....
- HDU 5528 Count a * b 2015 长春现场赛(积性函数)
- vmware 安装vmware tools
- iOS之旅--UIScrollView疑难处理
- Java版支付宝手机网站支付
- Angular基础入门2——开发环境的搭建
- 学习日记-phpstorm更换皮肤
- 使用nginx搭建集群tomcat8,redis实现session共享,文件共享问题
- SharePoint REST API
- linux让history记录时间和把所有命令都记录到message
- webpack打包后,JSON.stringify()报错!
- Boosting原理及其应用