V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
iOS 开发实用技术导航
NSHipster 中文版
http://nshipster.cn/
cocos2d 开源 2D 游戏引擎
http://www.cocos2d-iphone.org/
CocoaPods
http://cocoapods.org/
Google Analytics for Mobile 统计解决方案
http://code.google.com/mobile/analytics/
WWDC
https://developer.apple.com/wwdc/
Design Guides and Resources
https://developer.apple.com/design/
Transcripts of WWDC sessions
http://asciiwwdc.com
Cocoa with Love
http://cocoawithlove.com/
Cocoa Dev Central
http://cocoadevcentral.com/
NSHipster
http://nshipster.com/
Style Guides
Google Objective-C Style Guide
NYTimes Objective-C Style Guide
Useful Tools and Services
Charles Web Debugging Proxy
Smore
laobaozi
V2EX  ›  iDev

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

  •  
  •   laobaozi · 2015-12-01 16:41:28 +08:00 · 3476 次点击
    这是一个创建于 3284 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    21 条回复    2015-12-04 18:26:47 +08:00
    mofet
        1
    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
        2
    CDuXZMAPgHp1q9ew  
       2015-12-01 16:56:40 +08:00
    dorentus
        3
    dorentus  
       2015-12-01 17:32:52 +08:00
    iOS 8 开始,给 table view 设一个合理的 estimatedRowHeight ,再把 wHeight 设成 UITableViewAutomaticDimension 。

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

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

    @dorentus 不懂

    @babyhome 怎么说
    yh4801480
        7
    yh4801480  
       2015-12-01 18:05:25 +08:00
    楼主 接口是怎么抓到的 我也想撸一个-。-
    chaoxn
        8
    chaoxn  
       2015-12-01 18:08:30 +08:00
    @yh4801480 V2 的接口不用抓 往下拉 有 API
    loveuqian
        9
    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
        10
    Yvette  
       2015-12-01 23:23:14 +08:00 via iPhone
    歪个楼,如果有上传图片的功能就好了 :)
    Yvette
        11
    Yvette  
       2015-12-01 23:24:12 +08:00 via iPhone
    @Yvette 我是说楼主在做的客户端
    laobaozi
        12
    laobaozi  
    OP
       2015-12-02 08:39:37 +08:00
    @yh4801480 没用 api 直接解析的 html
    @Yvette 暂时还没考虑到这里
    laobaozi
        13
    laobaozi  
    OP
       2015-12-02 17:22:12 +08:00
    @mofet 感谢 getLabelSize 能返回正确的高度了
    @loveuqian 同谢
    cielpy
        14
    cielpy  
       2015-12-04 11:48:06 +08:00
    看了下楼主代码,首页那些 tab 不用每个 tab 一个 ViewContreoller 的,列表样式完全一样,只是获取数据的时候有一个值不一样,解析方式也是一样的,一个 VC 然后设置一个 type 之类的东西区别获取数据就行了吧。
    laobaozi
        15
    laobaozi  
    OP
       2015-12-04 13:45:29 +08:00
    @cielpy 我是想实现滑动到半个宽度时能看见下一个列表的内容所以才平铺的,
    如果不放这么多的话,有什么办法能达到这个效果

    //我自己也觉得 vc 太多了...
    cielpy
        16
    cielpy  
       2015-12-04 13:53:16 +08:00
    @laobaozi 用一个 ViewController 不影响平铺的。创建多个就行了。
    laobaozi
        17
    laobaozi  
    OP
       2015-12-04 15:07:40 +08:00
    @cielpy 意思是在一个 VC 里放三个 table,无限滚动?
    cielpy
        18
    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
        19
    laobaozi  
    OP
       2015-12-04 15:28:27 +08:00
    @laobaozi 所噶 ~
    laobaozi
        20
    laobaozi  
    OP
       2015-12-04 15:28:54 +08:00
    @cielpy 明白
    yh4801480
        21
    yh4801480  
       2015-12-04 18:26:47 +08:00
    @chaoxn 下面的 API 不全呢
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1078 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 19:21 · PVG 03:21 · LAX 11:21 · JFK 14:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.