怎么xib设置tableviewcelll之间的间距

主题 : lua 怎么设置tabview的cell间距?
级别: 新手上路
可可豆: 63 CB
威望: 63 点
在线时间: 212(时)
发自: Web Page
来源于&&分类
lua 怎么设置tabview的cell间距?&&&
使用Lua语言,编译器是cocos-code ide。cocos2dx 3.2版本,用到了tableview控件,可是就是无法设置每个cell之间的间距,不管怎么设置cell的宽高,cell的间距总是很大,请问如何把每个cell的间距设置为如下效果图上的效果,各位大神帮帮忙啊。代码部分和图片已经上传,拜谢了。效果图:
(704 K) 下载次数:53   
UID: 231210
可可豆: 540 CB
威望: 448 点
在线时间: 581(时)
发自: Web Page
以我对tableview的经验, 设置cell间距的办法就是,将cell的宽(或高, 取决于你需要的间距类型),设置为地板的宽+间距,设置底板的AnchorPoint为0点,位置为CCPointZero,这样单元格之间就会空出间距。 之后有个小问题就是最上面的单元格与viewSize的边缘也会出现一个你设置的间距的宽度的缝隙,如果不需要这个缝隙,你就需要设置一下tableview的container的position。 完全取决于你的需要。
级别: 新手上路
可可豆: 63 CB
威望: 63 点
在线时间: 212(时)
发自: Web Page
回 1楼(harris) 的帖子
谢谢大牛。我现在是每一个cell上布局2个按钮,一行就是一个cell,就如图上所示,然后上下滑动。现在想把每个cell之间上下空出15个像素左右的间距。我在代码里设置cell的高度为:按钮的高度 + 15&&,但是出来效果还是上下2行之间有非常大的间距,远远超过15。不知道是怎么回事,请教大牛。
级别: 新手上路
可可豆: 186 CB
威望: 176 点
在线时间: 106(时)
发自: Web Page
回 2楼(summerfish) 的帖子
在设置宽高函数中function RoleLayer.cellSizeForTable(table, idx)&&&&return 高,宽 --120,740 end&&这样设置就可以达到你图示效果
(2 K) 下载次数:34
UID: 231210
可可豆: 540 CB
威望: 448 点
在线时间: 581(时)
发自: Web Page
楼上说的是对的,上述方法就是控制图中红色方框的宽高。 你需要做的就是把这个高设置的比你的美术资源底板高出一些,作为间距。方法中的idx代表第几个cell,也就是说你在这个方法里可以通过判断idx,来为不同的cell设置不同的大小。如果你在一个cell里放置两个item,会出现触摸问题。。。当你点击某个Item时,tableCellTouched(CCTableView *talbe, CCTableViewCell *cell) 返回的是cell,而不是你设置的item,因此你在判断用户到底是点击了左边的item还是右边的item可能会出现问题。又如果你放进tableview的东西是一整个Menu, 又会出现用户touchbegan如果点到了某个item, 那么tableview就不能再响应滚动了。总之.. Scrollview相关的控件并不是很方便,需要额外的代码完善。
图片:41_c90b.png
级别: 新手上路
可可豆: 179 CB
威望: 179 点
在线时间: 240(时)
发自: Web Page
cocos2d-x KO榜交流群技术交流群,欢迎大家加入,共同探讨进步,不管你是刚入门在菜鸟,还是已经上路的大神,在这里,我们一起成长!*****,也可以点击链接加入群【cocos2d-x KO榜】:
级别: 新手上路
可可豆: 63 CB
威望: 63 点
在线时间: 212(时)
发自: Web Page
回 3楼(liyoushihaer) 的帖子
嗯,谢谢大牛。这个问题,解决了。cellSizeForTable这个函数,第一个返回的是高度,第二个返回的是宽度,我之前貌似是弄反了,先返回宽度,后返回高度。另外,在请教兄弟个问题,我用ccui里的listview这个控件,点下某个按钮就往ListView里添加一行新的数据,现在想在添加一行新数据后,默认滚动到新添加的那一行,请问该怎么实现?拜谢。
级别: 新手上路
可可豆: 186 CB
威望: 176 点
在线时间: 106(时)
发自: Web Page
回 6楼(summerfish) 的帖子
这个我也没研究过 。。。。。。。。。。
关注本帖(如果有新回复会站内信通知您)
3*3+1 正确答案:10
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版当前访客身份:游客 [
一分耕耘一分收获
:大哥,我研究了半天,发现你写的这个label是要固...
:谢谢作者了,赞一个!
:非常好的文章 谢谢
今日访问:68
昨日访问:64
本周访问:132
本月访问:1111
所有访问:14442
使用Autolayout xib实现动态高度的TableViewCell
发表于10个月前( 14:10)&&
阅读(11754)&|&评论()
0人收藏此文章,
最近又要做新功能了,虽然没有什么难点,只是获取后端XML数据显示到TableView,但是不是可以更简单快速的完成呢?原来Cell的动态高度一直都是通过sizeWithFont手动计算,潜意识觉得这应该不是最好的实现方式,但由于当时时间紧不允许尝试新技术,所以问题也就遗留了下来,这次又遇到了,时间充裕就解决下吧。
Autolayout是解决自适应frame问题的解决方案(iOS6.0就已经支持了,我现在才用= =#)。通过给视图元素设置合适的约束条件,内部会根据元素内容和限制条件计算出合适的尺寸显示。我们就不用自己手动写这些代码了。
文章步骤看上去有些复杂,真正做起来还是很快...
创建Xib文件
首先将Cell做好布局,调整到满意的位置和宽度,然后开始做Autolayout设定。
Autolayout操作方式有两种,一种是选择目标后,使用右下角的工具栏;另一种是直接使用右键拖拽目标,在弹出的菜单中选择限制项。当选择的目标比较小的时候,可以打开左侧的菜单,在这里做拖拽操作一样是可以的。个人感觉后者更方便一些。
开始之前,先来介绍下使用的基本工具吧。
第一个按钮是和对齐有关的,就是控制多个元素(Lable, Button等)的统一约束。例如我们需要让标题和内容按照左,就选择标题和内容元素,选择Leading Edges设置为5即可。
第二个按钮是和元素位置固定有关的限制条件,直接看图吧:
右侧能够看到当前选择元素限制条件的列表:
这里有两个参数,“Content Hugging Priority”和“Content Compression Resistance Priority”,感觉不太好理解,栈爆上找到一篇解释,讲的挺好的:
有时候想要一个元素的间距是一个动态值,例如距离右侧至少10pt(即&=10pt),那么可以在上图中点击右侧按钮(齿轮)进入详细设置:
第三个按钮是有关清除限制条件、根据限制更新视图大小的工具。个人比较常用的是清除限制条件,有时候设置错了很麻烦,直接清除掉重新来就行了。
上面这些就是常用到的一些限制条件了。个人觉得使用右键拖拽弹出的菜单选择更方便和直观一些,因为菜单中会根据拖拽内容动态显示可用项供我们选择,菜单如图
大致就是这些了吧……
我来谈谈自己的用法。总体上是从上到下,从左到右做约束限制。在这个例子中,就是设置标题-&内容-&发帖人这样的顺序。
设置标题的顶部和左侧距离,以及宽度(防止超出边界)。
设置内容的顶部(距离标题)和左侧距离,以及宽度。设置最大行数。
设置发帖人的顶部和左侧距离,以及高度。
设置发帖时间的顶部和左侧距离,距离右侧间距(防止内容过长)。
关键步骤,设置发帖人距离底部距离,如果不设置这个参数,那么下面代码计算的Cell高度会永远是0。
多试一试,如果有错误或者缺少限制,XCode会有提示。它报出的错误一般都是必须修正的,但它给的自动修正建议有时并不是我们想要的(正确的),想清楚再添加。
使用了xib制作的Cell,那么在原来的项目代码中如何使用呢?看代码:
12345678910111213141516171819202122232425262728293031323334353637
static NSString *CellIdentifier = @"CellIdentifier";&- (void)viewDidLoad{ //注册TableView中用于复用的Cell [self.tableView registerNib:[UINib nibWithNibName:@"BBSPostContentCell" bundle:nil] forCellReuseIdentifier:CellIdentifier]; //...}&//关键方法,获取复用的Cell后模拟赋值,然后取得Cell高度- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{&&&&BBSPostContentCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];&&&&&&&&NSDictionary *dataSourceItem = [self.dataSource objectAtIndex:indexPath.row];&&&&cell.titleLabel.text =&&[dataSourceItem valueForKey:@"title"];&&&&cell.contentLabel.text = [dataSourceItem valueForKey:@"body"];&& &&&&[cell setNeedsUpdateConstraints];&&&&[cell updateConstraintsIfNeeded];&&&&&&&&CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;&&&&&&&&return height;}&//在cellForRowAtIndexPath中,按照常规方法做赋值就行了- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ BBSPostContentCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];&&&&&&&&NSDictionary *dic = dataSource[indexPath.row];&&&&cell.titleLabel.text = dic[@"title"];&&&&cell.contentLabel.text = dic[@"body"];&&&&&&&&return cell;}
: 在测试时发现这部分的代码还存在一些性能问题(整个表视图在更新时会卡顿),我会稍后补上。
我在使用Instruments分析发现,heightForRowAtIndexPath中调用dequeueReusableCellWithIdentifier会占用很多CPU资源,因此我试着不使用registerNib方法注册复用Cell,而在代码中手动处理,类似这样:
BBSPostContentCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];if (cell == nil) {&&&&cell = [[NSBundle mainBundle] loadNibNamed:@"BBSPostContentCell" owner:self options:NULL][0];&&&&NSLog(@"cell loadNibNamed");} else { NSLog(@"cell dequeueReusableCellWithIdentifier");}
这时我发现这里的Cell调用dequeueReusableCellWithIdentifier方法总是返回nil,因此每次都是从xib中加载,从而耗费了大量的资源。问题的原因我还不清楚,目前我的解决方法是,单独生成一个Cell用于在heightForRowAtIndexPath方法中计算高度。
其次,在[tableView reloadData]和[tableView insertRowsAtIndexPaths]时,底层会将所有行高重新计算,这个会占用大量的时间,因此我试着对行高做了缓存,暂时解决了这个问题。
关于兼容性问题
由于Autolayout只能在iOS6.0以上版本使用,而根据友盟统计,目前6.0以下的用户大概还有8%左右(2013.12)。现在有两个办法解决:
哥不在乎,放弃这些用户!(好霸气=。=)把项目的部署版本修改为6.0以上即可。
咳…咳…这个嘛,用户还是有必要支持的………恩,那我们来说说这个怎么兼容。
思路很简单,我们告诉XCode,6.0以上版本使用Autolayout,以下的旧版本不要使用这个就可以了。
将原xib文件inspector中选择”Interface Builder Document”-&”Build for”-&”iOS 6.0 and Later”,告诉XCode,这个xib在6.0以上设备编译。
将xib文件拷贝一份副本,命名为”xxx_iOS5.xib”,在inspector中选择”Project Deployment Target”,也就是说使用项目部署目标版本(即最低版本5.0),并取消”Use Autolayout”选项。
在代码中根据系统版本加载不同的xib文件:
1234567891011121314
#define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) \([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)&#define IS_SUPPORT_AUTOLAYOUT&& SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"6.0")&- (void)viewDidLoad{ if (!IS_SUPPORT_AUTOLAYOUT) { &&&&//for iOS 5.x &&&&[self.tableView registerNib:[UINib nibWithNibName:@"BBSPostContentCell_iOS5" bundle:nil] forCellReuseIdentifier:CellIdentifier]; } else { &&&&[self.tableView registerNib:[UINib nibWithNibName:@"BBSPostContentCell" bundle:nil] forCellReuseIdentifier:CellIdentifier]; }}
最后别忘了在高度计算时,区分下代码:
123456789101112
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{&&&&if (IS_SUPPORT_AUTOLAYOUT) {&&&&&&&&//Autolayout部分代码,同上&&&&&&&&//.....&&&&&&&&return height;&&&&} else {&&&& //for iOS 5.x&&&& //为了简单起见,就直接使用固定值了,当然如果你要自己为iOS5用户手动计算动态高度,也是可以的。&&&&&&&&return 81;&&&&}}
2013的最后一篇文章,元旦快乐!&
原创文章,采用&&进行许可。转载请注明:转载自&,原文网址:
更多开发者职位上
1)">1)">1" ng-class="{current:{{currentPage==page}}}" ng-repeat="page in pages"><li class='page' ng-if="(endIndex<li class='page next' ng-if="(currentPage
相关文章阅读百度分拆百度外卖 后者已完成融资2.5亿美元
百度高管解读财报:搜索和O2O业务相辅相成
10个人的头脑风暴,一群人的思想碰撞
本网最新文章1850人阅读
IOS(229)
先说一些想法和发现记录在这里,以后抽空在完善具体内容。
我设置间隔的方法是重写 自定义tableviewcell的setFrame方法。
- (void)setFrame:(CGRect)frame
frame.origin.y += 10;//整体向下 移动10
frame.size.height -= 10;//间隔为10
[super setFrame:frame];
具体原因:
说先要说TableView的数据源方法
方法一 &-(CGFloat)tableView:(UITableView&*)tableView heightForRowAtIndexPath:(NSIndexPath&*)indexPath
方法二 &- (UITableViewCell&*)tableView:(UITableView&*)tableView cellForRowAtIndexPath:(NSIndexPath&*)indexPath
& & 最初我以为只要 每一个frame.origin.y增加10 就会有10的间距,但实际上显示出来的是全部的tableviewcell都向下移动了10。主要是代理方法一,方法一是返回UITableView每个cell的高度。与方法二调用方式不同,方法二是每当屏幕中出现一个Cell时,就调用一次。方法一就根据UITableView的行数,比如当UITableView的行数确定为20行时,方法一就会直接调用20次,算出这20行每行的高度。
& & 之后就是传入的frame这个参数的问题了,他的frame.origin.y,就是根据每行的高度来进行计算的。比如每行的行高都是44,那第一个cell传入的frame.origin.y为0,那第二个cell传入的frame.origin.y为44,那第三个cell传入的frame.origin.y为88,等等等(其实初始时,会传入初始化的frame设置,这里先忽略,以后有空再说)。所以frame.origin.y
&#43; 10依次每个cell的y&#20540;为10、54、98。这样就没有达到目的。
& & 所以在实现代理方法一时,我们就要为每行添加一个间隔的高度,如&#43;10。之后再重写setFrame方法将这10个高度减掉,那么上面的例子就是这样的了,每行的行高都从44变为54,传入的frame.origin.y依次为0、54、108,10个高度减掉后显示的高度依旧是44,frame.origin.y
&#43; 10依次每个cell的y&#20540;为10、64、118,对比上面的10、54、98,后面二个cell都下移了10,因此达到了间隔效果。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:52639次
积分:1794
积分:1794
排名:第14739名
原创:98篇
转载:201篇
(10)(4)(19)(29)(11)(12)(6)(8)(22)(48)(39)(29)(3)(6)(2)(12)(4)(1)(13)(3)(5)(2)(1)(2)(9)

我要回帖

更多关于 tableview删除cell 的文章

 

随机推荐