Objective-c——UI基础开发第九天(QQ好友列表)

一、知识点:

  1、双模型的嵌套使用

  2、Button的对齐方式

  3、优化UITableView的加载

  4、layoutSubview的使用

  5、cell的折叠代理

二、双模型的嵌套定义:

注意是将self.friends 尚未字典转模型进行的操作

二、cell的重用定义方式

方法一

QQCell *cell =[tableView dequeueReusableCellWithIdentifier:identifier];

/**

但是这种方法,如果不是在xib中定义了identifier是不会被重用的,使用方法二进行重用

if(cell==nil)

{

cell=[[NSBundle mainBundle]loadNibNamed:@"QQCell" owner:nil options:nil].lastObject;

}

*/

方法二

/**

到tableview注册一个重用的cell

NibName:xib的文件名

bundle:传空就是默认当前的bundle

没有使用xib registerClass 假设没有和xib进行关联

*/

UINib *nib=[UINib nibWithNibName:@"QQCell" bundle:nil];

[self.tableView registerNib:nib forCellReuseIdentifier:@"QQCell"];

方法二的不需要再判断cell是否为空  就可以在cellforRowAtIndexPath 在做cell是否为nil的判断就可以省略掉

总结:

使用类注册

self.tableview registerClass :forCellReuseIdentifier:

使用xib注册

UINib *nib =[UINib nibWithNibName :@“QQCell” bundle:nil];

[self.tableview registerNib:nib forCellReuseIdentifier:@“QQCell”];

三、button的布局

/**

重点怎么设置button 中text 和 image 都是左对齐,且image和text保持一定距离

1、设置contentHorizontalAlignment(UIControlContentHorizontalAlignmentCenter/left/Right/Fill)

2、设置text 和 image 的内边距(imageEdgeInsets/titleEdgeInsets)

*/

headerButton.contentHorizontalAlignment=UIControlContentHorizontalAlignmentLeft;

//设置图片或文本的内边距 分别采用 imageEdgeInsets/titleEdgeInsets  UIEdgeInsetsMake

headerButton.imageEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);

headerButton.titleEdgeInsets = UIEdgeInsetsMake(0, 15, 0, 0);

4.2)图片的旋转,问题:图片旋转之后可能会出现拉伸状况:

/**

为了在旋转之后保持原有的形状(contentMode)

UIViewContentModeScaleToFill 拉伸填充

UIViewContentModeScaleAspectFit 自适应

UIViewContentModeScaleAspectFill 自适应填充

UIViewContentModeCenter,保持原有的尺寸

*/

headerButton.imageView.contentMode = UIViewContentModeCenter;

#pragma mark 发现超出父view 的边界部分将会被切掉 修改属性 clipsToBounds

headerButton.imageView.clipsToBounds =NO;

四、tableview 的重用 (类似cell的重用)

/**

1、定义一个重用标识符

2、到缓存池中去找

3、判断是否为空

4、对headerview进行赋值并返回

*/

static NSString *headerIdentifier [email protected]"HeaderView";

HeaderView *headerView =[tableView dequeueReusableHeaderFooterViewWithIdentifier:headerIdentifier];

if(nil==headerView)

{

headerView=[[HeaderView alloc]initWithReuseIdentifier:headerIdentifier];

}

注意再HeaderView的类中 //外部调用的是哪个实例化方法,那么就重写哪个方法

所以使用:

if(self =[super initWithReuseIdentifier:reuseIdentifier])

五、在HeaderView中,加载的子view不能显示的原因:(LayoutSubview)

  view无法显示的原因有:

  1、颜色与父view相同

  2、没有添加到父view

  3、没有设置Frame

  4、透明度

  5、被别的控件遮盖

  6、hidden=yes

  7、检查父view的上述情况

注意:使用subview就相当于对控件进行一个强引用

//layer:布局 当view 的frame发生改变的时候就会调用

/**

如果在实例化的时候没有取到当前的frame

或者当当前的frame发生变化

或者当钱frame的bounds全部为0时

这个方法对内部的子view(frame),对控件进行设置

*/

-(void)layoutSubviews

{#warning 一定要调用父类的方法 因为这个是针对frame发生改变时调用的,所以不应该在这里做添加 只做frame 的设置,其它东西别动

[super layoutSubviews];

六、cell的折叠代理添加协议

1、设置代理属性

@class HeaderView;

@protocol HeaderViewDelegate<NSObject>

-(void)headerView:(HeaderView *) headerView didClickButton :(UIButton *)button;

@property (nonatomic,weak) id<HeaderViewDelegate> delegate;

2、通知代理

-(void)didClickButton:(UIButton *)button

{if([self.delegate responsToSelector:@selector(headerView:didClickButton:)])

{[self.delegate headerView:self didClickButton:button];}}

3、在viewcontroller中 遵守协议实现代理方法

headerView.delegate=self;

-(void)headerView:(HeaderView*)headerView didClickButton:(UIButton*)button{

}

提示:

numberofrowsInSection返回0时 将不执行cellForRowAtIndexPath

七、tip如何在代理中取出模型对应的section 并对model中的变量进行修改(tag)

在tableview的 viewForHeaderInSection重用方法中:

//获取哪一组

headerView.tag=section;

在协议方法中获取section

//1、 获取section的数值

NSInteger section = headerView.tag;

NSInteger section = headerView.tag;

//2、获取groupModel

GroupsModel *groupModel = self.dataArray[section];

//3、对groupModel中的isExplain变量进行修改

groupModel.explain =!groupModel.isExplain;

//4、刷新表格,为什么explain明明设置为yes了还是没用,因为tableview已经调用过numberofrowInsection方法,要想重新调用,需要使用reload刷新

//[_tableview reloadData];

NSIndexSet *indexSet =[NSIndexSet indexSetWithIndex:section];

[_tableview reloadSections:indexSet withRowAnimation:UITableViewRowAnimationFade];

#pragma mark 这里有一个问题,为什么三角形图像会点击一次加一次 就会出现类似瞬间变回原样的状态? 与reload的刷新有关,刷新将会让tableview的所有代码又重新执行一遍

时间: 2024-10-21 21:22:49

Objective-c——UI基础开发第九天(QQ好友列表)的相关文章

UI基础--UITableView实现仿QQ好友列表页面

需求:类似于QQ好友列表页面的显示,有好友分组,有好友数量,在线人数,vip会员.展开分组时显示分组好友,合并分组时不显示:具体效果图如下: 分析: 1.展开分组时显示分组好友,该功能可以使用显示UITableViewCell的数据即可: 2.分组头可以考虑使用一个headerView来实现: 示例文件结构: 具体实现步骤: 1.自定义数据模型类,由于plist文件中包含了2个字典,所以需要写2个数据模型: 2.自定义cell,属性包括数据模型以及生成可重用cell的方法,由于系统自带的子控件即

UI基础之UITableView案例QQ好友列表

一:模型数据 LLFriend #import <Foundation/Foundation.h> @interface LLFriend : NSObject /** * icon */ @property (nonatomic, copy) NSString *icon; /** * intro */ @property (nonatomic, copy) NSString *intro; /** * name */ @property (nonatomic, copy) NSString

【iOS开发-67】QQ好友列表案例:UITableViewHeaderFooterView类、layoutSubviews与didMoveToSuperView方法等

(1)效果 (2)源代码于素材下载 http://pan.baidu.com/s/1jfdr4 (3)总结 --有标记状态的属性,应该在对应的模型类中,并且把getter方法重命名为isXXX: --UITableViewHeaderFooterView不可以用xib,只能用代码创建. --layoutSubviews方法,是当改变父控件高度的时候,自动调用这个方法,所以一般在这里面设置子控件的frame.因为子控件随着父控件而改变.这里要注意的时,初始化方法中父控件没有frame,所以子控件设

[iOS基础控件 - 6.9.3] QQ好友列表Demo TableView

A.需求 1.使用plist数据,展示类似QQ好友列表的分组.组内成员显示缩进功能 2.组名使用Header,展示箭头图标.组名.组内人数和上线人数 3.点击组名,伸展.缩回好友组 B.实现步骤 1.编写MVC结构 (1)根据plist文件结构,编写model,使用嵌套型 1 // 2 // FriendGroup.h 3 // FriendsList 4 // 5 // Created by hellovoidworld on 14/12/12. 6 // Copyright (c) 2014

【iOS基础控件 - 13】【Demo 】QQ好友列表TableView

A.需求 1.使用plist数据,展示类似QQ好友列表的分组.组内成员显示缩进功能 2.组名使用Header,展示箭头图标.组名.组内人数和上线人数 3.点击组名,伸展.缩回好友组 code source: B.实现步骤 1.编写MVC结构 (1)根据plist文件结构,编写model,使用嵌套型 1 // 2 // FriendGroup.h 3 // FriendsList 4 // 5 // Created by hellovoidworld on 14/12/12. 6 // Copyr

iOS TableView实现QQ好友列表(三)

上节我们讲到如何展示好友信息 iOS TableView实现QQ好友列表(二) http://blog.csdn.net/lwjok2007/article/details/46549111 接下来我们将分组点击的时候折叠起来. 首先新建一个可变字典用来存储当前列表是否展示 NSMutableArray *selectedArr;//控制列表是否被打开 selectedArr=[[NSMutableArray alloc]init]; 根据前两节所讲,我们讲分组名称放在section的heade

仿QQ好友列表界面的实现

TableView有2种style:UITableViewStylePlain 和 UITableViewStyleGrouped. 但是QQ好友列表的tableView给人的感觉似乎是2个style效果都有,但是tableView不能实现2种效果同时存在. 其实只是用到了Plain这个style,只是在cell的个数显示上做了个处理(个人见解,希望可以帮到有需要的人.....) 当通讯录那一组的cell的组头视图中的button是普通状态下的时候,并不是不显示cell,而是显示一个没有任何内容

iOS-QQ好友列表 iOS 页面间几种传值方式(属性,代理,block,单例,通知)

主要是 点击按钮实现下拉 刷新数据 页面间传值 // // HMFriendsModel.h // QQ好友列表 // // Created by YaguangZhu on 15/9/1. // Copyright (c) 2015年 YaguangZhu. All rights reserved. // #import <Foundation/Foundation.h> @interface HMFriendsModel : NSObject @property(nonatomic,cop

基于Qt的类似QQ好友列表抽屉效果的实现

前段时间在忙毕业设计,所以一直没有更新博客.今天答辩完以后,将对我的毕业设计进行模块展示,供Qt初学者进行参考. 毕业设计题目:Linux系统下基于Qt的局域网即时通信系统设计与实现 其中我有一个类似于QQ的好友列表,然后对好友可以进行分组管理,毕设中具体效果图如下: 网上查寻到的设计思路: 1.采用QToolBox的方式,虽然看起来有点样子,但是并不是我们所熟悉的好友列表,比如:http://blog.csdn.net/qianguozheng/article/details/6719074

tableView练习 -- QQ好友列表

LWTViewController.h // // LWTViewController.h // tableView练习 -- QQ好友列表 // // Created by apple on 14-6-1. // Copyright (c) 2014年 lwt. All rights reserved. // #import <UIKit/UIKit.h> @interface LWTViewController : UITableViewController @end LWTViewCon