QQ聊天界面

QQ聊天界面.

注意点:

  1. UIView没有背景图片属性,添加UIImageView再设置.
  2. UITableView的背景会被cell挡住,需要显示则要把cell设置一下.
  3. 图片拉伸不变型-平铺样式.美工图片常用处理方式:

如下:

+ (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聊天列表.

思路与步骤:

  1. 数据如果是字典套字典形式,就需要使用模型嵌套转换,过程封装在各自模型中.
  2. 如何设置每个section的标题headView:
    • 系统组标题自带子控件不够用时,此时需要自定义头尾;
    • 思路步骤类似于cell,不同在于cell创建在数据源第三方法中.headView创建在数据源的viewForHeaderInSection方法中.
  3. 添加点击head使闭合/开启cell功能:
    • 原理:闭合时设置cell行数为0.(第二数据源方法))
    • 新增一个记录状态的数据,BOOL型.在监听点击方法里面使用并设置数据self.open = !self.isOpen.
    • 需要使用自定义代理来进行通信,用于表示点击完毕,刷新数据.
  4. 如果需要点击后改变子控件状态,例如让三角图片旋转.
    • 由于在所有的初始化方法中(init),控件的frame都会被初始化为0;所以如果希望点击之后子控件位置有所改变,仅在set方法中设置frame不行,应为我们点击之后需要刷新(调用数据源所以方法)才能显示,而刷新时会调用初始化方法又会把farm重置,set方法又会设成原来位置.
    • 所以需要重写-(void)layoutSubviews //当控件fram发生改变之后调用.在里面要先调用父类方法.之后在其中进行点击监听后控件的frame设置.这样就可以点击变动子控件了.
    • 引申的,不只于frame的变化.还可以用此方法进行其他属性的修改.
    • 有点注意的地方,图片旋转后应可能会拉伸,需要设置contentMode属性居中.超出不裁剪.


UI基础总结

UI基础模板—MVC
  • plist数据转成对应模型,过程封装在各个模型工厂方法中,最后嵌套的结果groups模型懒加载到控制器中.
  • 自定义视图类View,重写类的创建和init方法,
    1. 把重用封装在自定义的类方法中.
    2. 重写initwithFrame方法,此方法中创建-添加-记录子控件,并且可以设置不需要数据的非frame的格式属性.
    3. 设置子控件动态属性在数据set方法中.
    4. frame属性在layoutsubView中设置.
    5. 有些行为需要通知外部,对象间通信的需求等 使用代理或通知或block.
  • Controller只需创建view,把模型传给对应view.–有特殊需求做做代理.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值