也撸一个 V2EX 的 IOS 客户端,卡在 label 的高度计算

2015-12-01 16:41:28 +08:00
 laobaozi

上地址
https://github.com/lbz235/V2EX

工作主要是 js 和 php,有空学 ios,边学边撸断断续续写了几个月
之前卡在高度计算,刚好工作任务多就放了大半个月

tableView 在加载数据时才给 UILbale 的 text 赋值,怎样才能正确的计算 UILabel 的高度
今天继续查资料没找到什么好办法,V 友在类似这种计算高度时都是怎么解决的?

//渣代码 轻喷 目前以撸出为目标 未考虑优化

3468 次点击
所在节点    iDev
21 条回复
mofet
2015-12-01 16:49:14 +08:00
如此如此

+ (CGSize)getLabelSize:(NSString *)title {
UIFont *font = [UIFont systemFontOfSize:YOUR_FONT_SIZE_HERE];

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init];
paragraphStyle.lineBreakMode = NSLineBreakByWordWrapping;
NSDictionary *attributes = @{NSFontAttributeName:font, NSParagraphStyleAttributeName:paragraphStyle.copy};

CGSize size = [title boundingRectWithSize:CGSizeMake(YOUR_WIDTH_HERE, INT_MAX)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:attributes
context:nil].size;

size.width = ceil(size.width);
size.height = ceil(size.height);

return size;
}
CDuXZMAPgHp1q9ew
2015-12-01 16:56:40 +08:00
dorentus
2015-12-01 17:32:52 +08:00
iOS 8 开始,给 table view 设一个合理的 estimatedRowHeight ,再把 wHeight 设成 UITableViewAutomaticDimension 。

然后 cell 里面就可以使用 Auto Layout 来自动推断每个 cell 的高度,不需要再写任何其它代码。
dorentus
2015-12-01 17:33:24 +08:00
s/wHeight/rowHeight/
babyhome
2015-12-01 17:36:13 +08:00
ios8 超级简单 根本不用你计算
laobaozi
2015-12-01 17:45:10 +08:00
@mofet 明天试一试

@wujichao @dorentus
这篇博客 http://blog.sunnyxx.com/2015/05/17/cell-height-calculation/看过
一开始不太想用第三方的库,想自己实现一些东西

@dorentus 不懂

@babyhome 怎么说
yh4801480
2015-12-01 18:05:25 +08:00
楼主 接口是怎么抓到的 我也想撸一个-。-
chaoxn
2015-12-01 18:08:30 +08:00
@yh4801480 V2 的接口不用抓 往下拉 有 API
loveuqian
2015-12-01 18:36:51 +08:00
如果你要兼容 iOS7 你就不能用那个预算高度了
我的做法是在模型里面增加一个 cellHeight 属性
不通过 rowHeight 固定高度,通过代理方法返回每一个 cell 的高度
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
LXCategoriesDetailsModel *model = self.downloadedMusicArr[indexPath.row];

return model.cellHeight;
}
然后重写 cellHeight 的 getter 方法,在里面计算高度
遇到文字就这么算
CGFloat textH = [self.name boundingRectWithSize:CGSizeMake(textW, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : [UIFont systemFontOfSize:17],
} context:nil].size.height;
self.name 是文字内容 textW 是宽度,然后告诉他字体大小是 17
他会返回我一个 frame
取里面的 height 就是这段文字在这个字体,这个宽度下,会是这么高
Yvette
2015-12-01 23:23:14 +08:00
歪个楼,如果有上传图片的功能就好了 :)
Yvette
2015-12-01 23:24:12 +08:00
@Yvette 我是说楼主在做的客户端
laobaozi
2015-12-02 08:39:37 +08:00
@yh4801480 没用 api 直接解析的 html
@Yvette 暂时还没考虑到这里
laobaozi
2015-12-02 17:22:12 +08:00
@mofet 感谢 getLabelSize 能返回正确的高度了
@loveuqian 同谢
cielpy
2015-12-04 11:48:06 +08:00
看了下楼主代码,首页那些 tab 不用每个 tab 一个 ViewContreoller 的,列表样式完全一样,只是获取数据的时候有一个值不一样,解析方式也是一样的,一个 VC 然后设置一个 type 之类的东西区别获取数据就行了吧。
laobaozi
2015-12-04 13:45:29 +08:00
@cielpy 我是想实现滑动到半个宽度时能看见下一个列表的内容所以才平铺的,
如果不放这么多的话,有什么办法能达到这个效果

//我自己也觉得 vc 太多了...
cielpy
2015-12-04 13:53:16 +08:00
@laobaozi 用一个 ViewController 不影响平铺的。创建多个就行了。
laobaozi
2015-12-04 15:07:40 +08:00
@cielpy 意思是在一个 VC 里放三个 table,无限滚动?
cielpy
2015-12-04 15:17:16 +08:00
@laobaozi 不是啊,一个 VC 里包含一个 TableView ,比如这样的一个 VC 叫 VCA ,有一个属性是 type

像你这里,既然是 add 一个 VC 的 view ,那你就可以创建 N 个 VCA 并将它的 view 按照你这样的方式 add 上去,并设置不同的 type ,用这个 type 去获取不同的列表的数据就行了。因为除了拿数据这一步骤不一样,其他都是一样的。
laobaozi
2015-12-04 15:28:27 +08:00
@laobaozi 所噶 ~
laobaozi
2015-12-04 15:28:54 +08:00
@cielpy 明白

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/240330

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX