您的位置:首页 > 产品设计 > UI/UE

UI控件学习

2016-02-25 17:09 495 查看

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属性.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面向对象