UI基础(三)之模型、KVC的理解和使用方式
未完待续.....
本来想偷个懒,省去OC 加强的部分,直接从UI开始写博客,但后来发现,OC 加强很多知识点自己并没有搞清楚,只能打破计划把前面的写完了..唉..要疯啊!!!
溜达一圈还是回来了,OC基础搞完了,加强内存管理,还要不断完善,这就得通过各种面试题求虐了.
1.KVC和KVO
Cocoa:苹果的面向对象开发框架,用来生成 Mac OS X 的应用程序。主要的开发语言为 Objective-c, 一个c 的超集。(就是用来开发苹果系统上的应用程序的框架)
注意:
在KVC中会遇到字典转模型的问题,模型类中会出现一个重写构造方法,里面有个小知识点会产生一些小迷惑,即self = [super init];
为什么要写这一步并且判断呢?
我们知道init方法是模型类的父类NSObject中的方法,之所以让父类初始化是和内存管理相关,什么意思呢,就是说子类继承父类拥有父类所有的属性和方法,init方法就是初始化用的,也就是给属性初始化赋值用的,子类继承自父类,子类要想进行初始化必须要进行完全的初始化,即子类中的所有成员属性必须完成init初始化,所以这些成员属性就是子类新的属性加上父类中的成员属性,而子类重写构造方法的目的就是为了给子类中新的属性赋初值的,但其继承自父类的属性也要初始化一下的,否则就不能完成初始化.
2.UIScrollView
知识点一:三个属性:contentSize,contentInset,contentOffset
contentSize代表滚动范围
// 如果以后开发的时候,哪个方向不需要滚动可以直接设置为0 self.scrollView.contentSize = CGSizeMake(0,0);
contentInset代表拖拽回弹的最终位置的设置
contentOffset代表scrollview内部控件的偏移量
contentOffset是哪个点???
首先从字面理解:内容偏移
我可是查了词典的!!!
对于contentOffset有的时候我们会产生错误理解。 我不想在这里介绍错误的理解避免不必要的混淆。
我们什么时候会遇到contentOffset???
更多的时候是在滚动试图中,我们可以通过它结合代理实现一些方法。
比如轮播(我会在下一篇介绍轮播的实现原理至于代码如果需要我可整理出来) 那么请让我通过图片演示来解释contentOffset。
图一中绿色为屏幕也就是最大的显示范围也是滚动视图的frame,红色为滚动试图的contentSize。
我们可以把两个框理解为两个View。那么得出的结果就是两个View的左上顶点重合,这时的contentOffset为{0,0}。
图二中我们把红色向左平移100,也就相当于我们向左滚动了100.
这样产生的结果就是contentOffset为{100,0}.
知识点二:缩放
按住option可以实现对scrollview的缩放
步骤是:
#import "ViewController.h" @interface ViewController ()<UIScrollViewDelegate> @property (weak, nonatomic) IBOutlet UIScrollView *scrollView; @property (weak, nonatomic) IBOutlet UIImageView *imageView; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //1.先实现滚动 self.scrollView.contentSize = CGSizeMake(self.imageView.bounds.size.width, self.imageView.bounds.size.height); //2.实现缩放第一步,设置代理对象 self.scrollView.delegate = self; //3.设置缩放比例 self.scrollView.maximumZoomScale = 1.5; self.scrollView.minimumZoomScale = 0.1; } //4.实现代理方法 - (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView{ return self.imageView; }
滚动的几个代理方法学习:
#pragma mark -- 需要掌握的代理方法 /** * scrollView在滚动的过程中做的事情 只要滚动界面就会调用 */ - (void)scrollViewDidScroll:(UIScrollView *)scrollView{ NSLog(@"scrollView正在滚动 %@ ", NSStringFromCGPoint(scrollView.contentOffset)); } /** * scrollView开始滚动的方法 * 只会调用一次,手指按上去的时候不会触发,只有开始滚动拖动的时候才会触发 */ - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{ NSLog(@"开始滚动"); } /** * scrollView停止滚动的方法 * 只会调用一次,手指停止移动的时候不会触发,只有当手指离开的时候才会触发 * */ - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{ // 0 --> NO 非0 YES NSLog(@"停止滚动 %d",decelerate); } #pragma mark -- 了解 //如果慢慢对屏幕滚动的时候,这个时候停止是不会触发的 //只有当在屏幕快速滑动,这个时候手指离开屏幕 scrollView依然在滚动,在这种情况下,scrollView停止滚动的时候才会触发 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{ //输出调用的是哪个方法 NSLog(@"%s",__func__); }
知识点二:无限图片轮播器: