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
rannie
V2EX  ›  iDev

请教一个名称截断的方法

  •  
  •   rannie ·
    rannie · 2015-08-26 09:34:34 +08:00 · 3324 次点击
    这是一个创建于 3384 天前的主题,其中的信息可能已经有所发展或是发生改变。

    对于一个给定的字符串,我想对字符串最大宽度有个限制,如果超过了就像 label 那样用尾截断, 类似 v2e... 这种,现在是不断减最尾字符测宽度来做的。有什么更好的解决方法吗?

    第 1 条附言  ·  2015-08-26 10:09:35 +08:00
    就是在应用中有涉及,不是在网页中。。。
    21 条回复    2015-08-27 16:03:40 +08:00
    babyname
        1
    babyname  
       2015-08-26 09:38:02 +08:00
    func mySubstring (string, length )
    if string.length > length
    return string.substring (0, length ) + "..."
    else
    return string
    rannie
        2
    rannie  
    OP
       2015-08-26 09:39:54 +08:00
    @babyname 可能我说的不清楚 是宽度 不是字符串长度 因为里面有符号或者中英文 所以长度这个不合适吧
    ljbha007
        3
    ljbha007  
       2015-08-26 09:41:10 +08:00
    没有
    babyname
        4
    babyname  
       2015-08-26 09:42:01 +08:00
    @rannie 嗯,宽度就不行了
    VinKing
        5
    VinKing  
       2015-08-26 09:54:06 +08:00
    css 截断?
    vitovan
        6
    vitovan  
       2015-08-26 09:57:22 +08:00 via Android
    cnhongwei
        7
    cnhongwei  
       2015-08-26 09:58:50 +08:00
    如果是在网页中显示,可以使用 css 实现就行了,如果是后台, java 的话,可以有一个取巧的办法,就是使用 gbk 编码转为 byte 数组,刚好汉字是两个字节,而英文是一个字符,取固定的字节长度,再转回来就行了,因为可能会有一个字符只取到一半的情况,所以你可以多取一个字节,转回来后去掉最后一个字符。

    如果你还有其它的特殊字符,那就没有办法了,理论上讲,宽度是和字体相关的,只有通过绘制字体,才知道真的有多宽。
    viowan
        8
    viowan  
       2015-08-26 09:58:59 +08:00
    网页上面?可以试试 text-overflow: ellipsis; 不过这个是 CSS3 里面的,以前的感觉只能用 overflow 之类的来实现了.
    bigcoon
        9
    bigcoon  
       2015-08-26 10:00:16 +08:00 via iPhone
    自己计算字符串长度 中文字符算长度 2
    TakanashiAzusa
        10
    TakanashiAzusa  
       2015-08-26 10:02:08 +08:00
    宽度。。这个还和前端字体有关系啊。。一定要弄的话给前端做比较好。。
    Lockerios
        11
    Lockerios  
       2015-08-26 10:39:32 +08:00
    一个 Label (显示文本),然后在上层的最右侧盖一个和父视图同底色的 Label (显示 "...")

    恩,坑了些...

    ————————

    其实可以继承一个 UILabel 子类,然后重写

    ```
    - (void )drawRect:(CGRect )rect;
    ```

    在其中使用

    ```
    - (void )drawInRect:(CGRect )rect withAttributes:(NSDictionary *)attrs NS_AVAILABLE_IOS (7_0 );
    ```

    来绘制上文本,这样根据绘制时候的 Frame 就可以控制显示的方式了。

    这个或许是可行的。
    rannie
        12
    rannie  
    OP
       2015-08-26 11:03:57 +08:00
    @Lockerios 我就是想要 label 的效果,如果这样的话 我直接用 label 不就好了 都不用 drawRect...
    Anybfans
        13
    Anybfans  
       2015-08-26 12:10:25 +08:00
    quix
        14
    quix  
       2015-08-26 13:00:05 +08:00
    loginv2
        15
    loginv2  
       2015-08-26 13:30:06 +08:00
    正则匹配 /.{你要的长度}/us 然后拼接上 “....”
    Lockerios
        16
    Lockerios  
       2015-08-26 15:55:01 +08:00
    @rannie oUo 之前没理解成功。
    holystrike
        17
    holystrike  
       2015-08-26 15:58:27 +08:00
    弄个中英文等宽字体, 1 汉字 2 英文字母宽,然后截字
    tabris17
        18
    tabris17  
       2015-08-26 18:15:58 +08:00
    英文使用等宽字体或者全角英文字母,这样才算得出字宽
    BB9z
        19
    BB9z  
       2015-08-26 23:43:07 +08:00
    rannie
        20
    rannie  
    OP
       2015-08-27 15:30:10 +08:00
    @holystrike 如果有特殊符号就不行了 这么算不好
    holystrike
        21
    holystrike  
       2015-08-27 16:03:40 +08:00
    @rannie 符号也是一样的等宽嘛,例如标准宋体
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2912 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 02:53 · PVG 10:53 · LAX 18:53 · JFK 21:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.