1.实例:超级猜图.
思路:
- 根据固定的控件用拖控件和活得控件代码创建,或者多个固定的有顺序的也可用代码创建,然后分区域设计.
- MVC思想.管理数据与视图
- 面向对象-本质 万物间的联系.根据对象间的关系来设计控件功能与属性.
有用的功能:
View设置不可操作,其包含的子控件也会不可操作.
self.view.userInteractionEnabled = NO;
有的视图上控件需要重组,必须先删除原来的-加个判断-subviews是数组所以.
//对数组中每个元素执行一次--方法--;
[self.answerView.subViews makeObjectsPerformSlector:@selector(方法))]
-(void)方法{
//对删除数组中第一个控件元素,由于每执行一次,第0个元素删除后,后面自动进一位,下一次又删除第0元素.这样就能全部清除了.
[self.answerView.subView[0] removeFromeSuperView]
}
设置和隐藏苹果上方的状态栏:
-(UIStatusBarStyle)perferredStatusBarStyle{
return UIStatusBarStyeLightContent;
}//设置状态栏为白色
-(BOOL)prefersSttusBarHidden{
return YES;
}//隐藏状态栏
有些对象间的联系,在功能变化后需要记录传递联系的数据.此时定义对应的成员变量进行记录,防止作用域结束释放.
2.UIScrollView 滚动视窗.
滚动思路:
- 要显示的素材拖进UIScrollView.素材很多,放不下,需要滚动查看.
- 设置UIScrollView要滚动的范围.contentSize.frame.size指的是: UIScrollView控件的大小.
contentSize指的是:UIScrollView滚动范围的大小. - 设置contentinset-留白.
- 设置congtentffset-偏移量.自动滚动必须属性,决定了素材的位置.
以整体scrollView-contentSize左上为原点.偏移量其实是scrollView-frame与原点坐标差,
其他属性:
@property (nonatomic) BOOL bounces; 是否需要弹窗效果.
@property (nonatomic,getter=isScrollEnable) BOOL scrollEnabled; 是否能滚动
@property (nonatomic) BOOL.....
3.代理delegate:
应用场合:
- 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象)
- 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象)
- 当对象A无法处理某些行为的时候,想让对象B帮忙处理 (让对象B成为对象A的代理对象)
- 对象之间的传值
请代理三部曲:
1> 写一个协议, 把自己不方便(或者自己不想)做的事情列出来(@protocol StudentDelegate )
2> 包含进来一个遵守协议的对象, 对象可以是任意类型(id delegate;)
3> 当自己发生一些事情想通知代理去做, 就是调用代理对应的方法
([self.delegate studentDidReceiveDelivery:self];)
当别人的代理三部曲:
1> 遵守协议(@interface Teacher : NSObject)
2> 实现协议里面对应的方法
3> 设置代理的对象, 给代理对象赋值. 建立起来两者的代理关系: 例:self.scrollView.delegate = self;
代理设计模式的核心作用就是为了解耦. 解除对象之间的紧耦合性.
使用代理的注意点:
- 协议的命名规则 类名+Delegate,代理属性是weak的.
- 一般协议里面的方法都写成 @optional
- 协议里面方法的命名: 小写类名开头+ 描述这个方法在什么时间或者发生什么事情调用, 第一个参数一般是类自身的对象
- 调用代理的方法之前,首先判断代理有没有实现对应的方法, 如果实现了才去调用([self.delegate respondsToSelector:@selector(studentDidReceiveDelivery:)])
对于某些系统类,苹果帮我们做了请代理三部曲,我们只需做后三步:
某些系统类自定了协议和代理,方便我们对这些控件方法进行监控:例如,用户拖动了动作条,我们可以遵守此功能类定的协议(一般是控制器遵守),实现协议里拖动状态的方法,写进我们想在用户操作时进行的事项.用户在操作时,系统会自动调用我们实现的方法.;
简而言之: 代理监听
4.图片轮播器
思路:
- 向UIScrollView中循环添加UIImage.按照自身宽度实现分页
- 添加分页指示器UIPageControl,建立两者联系.利用通过当前的滚动的偏移值来计算出当前滚动到哪张图片了
- 用当前的contentOffset + 半个图片的宽度 除以 每个图片的宽度, 取商, 等于几就是第几页 .
使用NSTimer定时器实现自动滚动功能, 在视图完成加载的最后启动一个定时器, 让定时器 每隔一定的时间之后去执行一个方法.在方法中实现自动滚动. 补充 : 1> NSTimer(时间间隔比较大1秒,几秒)2> CADisplayLink(时间间隔比较小,0.0几秒等) 注意 : 1> 调用timerWithXxx创建的timer,需要再调用一次fire才能启动 2> 调用scheduleXxx创建的timer,不需要再调用frie自动启动
规范式BUG:
//BUG 1 :拖住scrollView不动时,定时器仍旧计算,再可以动的时候把时间补回来.
//解决方法: 当我们拖住scrollView不动,实际进行了scrollView的拖拽方法.我们只要添加此方法监听(代理),当触发时停止定时器记时.
//应为计时器不能停止,无奈的,我们只能在拖拽开始代理监听方法中取消定时器,拖拽结束代理监听方法中创建;
//BUG 2: 当我们手动操作别的线程时,计数器的进程依旧会被暂停,恢复后依旧补时间.因为苹果规定了UI界面是单线程的
//解决方法:同上1.,把我们要操作的线程拉倒监听方法里.
// 第二种,主线程循环模式:对线程间进行来回执行,CPU可以高速进行切换, 在定时器创建完成之后,告诉运行循环中的主线程让滚动和拖拽事件同时进行.
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
5.pickerView和DatePick选择器
1. pickView:多列滚动选择
a. 数据源方法,两个:
* 多少列
* 第component列多少行
b. 具体数据用它的代理方法设置:
* titleForxxxxxx,第component列第row行要显示什么文本.
* didSelected: 选中第component列第row就会调用;
c. 有初始化显示关联的label时,手动调用didSelected,for-in实现.
d. 做多列之间关联时,需要在由SelectedRowInComponent方法获取选中的关联列的第几行,并注意刷新.(随机arc4…)
* 二级联动有个bug,滚动时容易数组越界,需要对获取的列行下标进行记录.
e. pickerView的行内容如果是view就会类似于cell,滚动时也会不停创建和销毁,不过这个不需要我们优化,在对应的内容设置方法中,系统已经传入了一个view.- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(nullable UIView *)view;
此方法中: pickerView = view即可,再加个if(pickView == nil)判断,如果为空,才创建新的view.随机数–arc4
2.datepick:日期选择器
a. 不需要数据源和代理方法进行设置内容.系统内部封装了日期,选择不同格式即可.
b. 一般用法是和文本框结合,把点击时弹出的键盘进行自定义成日期选择器.
* 文本框的inputView属性=datepick对象即可.
* datePick的local属性可设置日期语言国籍.
* 自定义键盘的上方可设置工具控件,是inputAccessoryView属性.