QQ聊天界面.
注意点:
- UIView没有背景图片属性,添加UIImageView再设置.
- UITableView的背景会被cell挡住,需要显示则要把cell设置一下.
- 图片拉伸不变型-平铺样式.美工图片常用处理方式:
如下:
+ (UIImage *)resizableImage: (NSString *)name {
UIImage *normal = [UIImage imageName:name];
CGFloat w = normal.size.width * 0.5;
CGFloat h = normal.size.height * 0.5;
return [normal resizableImageWithCapInsets:UIEdgeInsetsMake(h.,w,h,w)];
}
- cell的重用机制下,有时需要获取到上一次的数据进行对比,MVC下凡是数据有关都归模型负责,需要在模型中新增一个属性来存储.在懒加载的遍历中获取上一次的数据.
- 设置文本框的光标初始位置不贴边. UITextFiled有一个leftView属性,设置leftView的三部曲以及一个=UITextFieldViewModeAlways 这样就不贴边,有view占位.
通知机制:
为了完成对象间的通信.
与代理的区别:
- 代理时一对一,通过协议.
- 通知可以多对多,通过通知对象中心.
属性:
- 通知的名称 - name.
- 通知的发布者 - object
- 额外消息 - userInfo
思路:
通知的监听–>发布–>移除.
具体步骤:
//1.获取通知对象
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
//2.添加监听器:observer->监听者 selected 监听者将调用的方法 name:(通知名) object:( 通知发布者)
[center addObserver: xxxxx]
//3.发布通知.
[center postNotificationName : object: userInfo]
//4.移除监听器-必须在监听者释放前取消监听器的注册,不然引起野指针.
-(void)dealloc [center removeObserver];
例:
键盘状态通知-键盘属于系统,在变化时自动UIDevice发送通知UIDevice类提供一个单粒对象,代表设备及相关信息,如电池量,设备类型等,通过[UIDevice currentDevice] 可以获取这个对象.
对象会不间断发送一些系统通知,字符串形式:
UIKeyboardWillShowNotification //键盘即将显示
…will/did…hide/change //键盘隐藏/位置尺寸变化
取出键盘通知的额外消息:包含了弹出时间,frame变化等.
利用这些数据进行计算.计算结果用来设置联动的控件变化.在@selected中执行.引入note参数.
UITextField如何获取键盘输入:
//是否允许文本框编辑
(BOOL) textFieldShouldBeginEditing:(自己传进去){ return YES;}
//当点击return(send)键时,
(BOOL)textFieldShouldReturn:..
{
//1.获取输入数据
//2.创建新的数据模型加到self.messages.
创建一个数据模型
设置消息类型 model.type =
设置发送正文 model.text=uierInput;
设置消息时间 NSDate *now = [NSDate date]
获取一个日期时间转化器: NSDateFormatter *
//新增数据,传入数据,刷新数据,
//设置最后一行滚动到顶.
[self.tableView scrollToRowAtIndexPath: idxPath atScrollPosition: UITableViewScrollPostionTop animated:yes]
}
QQ聊天列表.
思路与步骤:
- 数据如果是字典套字典形式,就需要使用模型嵌套转换,过程封装在各自模型中.
- 如何设置每个section的标题headView:
- 系统组标题自带子控件不够用时,此时需要自定义头尾;
- 思路步骤类似于cell,不同在于cell创建在数据源第三方法中.headView创建在数据源的viewForHeaderInSection方法中.
- 添加点击head使闭合/开启cell功能:
- 原理:闭合时设置cell行数为0.(第二数据源方法))
- 新增一个记录状态的数据,BOOL型.在监听点击方法里面使用并设置数据
self.open = !self.isOpen
. - 需要使用自定义代理来进行通信,用于表示点击完毕,刷新数据.
- 如果需要点击后改变子控件状态,例如让三角图片旋转.
- 由于在所有的初始化方法中(init),控件的frame都会被初始化为0;所以如果希望点击之后子控件位置有所改变,仅在set方法中设置frame不行,应为我们点击之后需要刷新(调用数据源所以方法)才能显示,而刷新时会调用初始化方法又会把farm重置,set方法又会设成原来位置.
- 所以需要重写
-(void)layoutSubviews //当控件fram发生改变之后调用.
在里面要先调用父类方法.之后在其中进行点击监听后控件的frame设置.这样就可以点击变动子控件了. - 引申的,不只于frame的变化.还可以用此方法进行其他属性的修改.
- 有点注意的地方,图片旋转后应可能会拉伸,需要设置contentMode属性居中.超出不裁剪.
UI基础总结
UI基础模板—MVC
- plist数据转成对应模型,过程封装在各个模型工厂方法中,最后嵌套的结果groups模型懒加载到控制器中.
- 自定义视图类View,重写类的创建和init方法,
- 把重用封装在自定义的类方法中.
- 重写initwithFrame方法,此方法中创建-添加-记录子控件,并且可以设置不需要数据的非frame的格式属性.
- 设置子控件动态属性在数据set方法中.
- frame属性在layoutsubView中设置.
- 有些行为需要通知外部,对象间通信的需求等 使用代理或通知或block.
- Controller只需创建view,把模型传给对应view.–有特殊需求做做代理.