CoreText 进行图文混排时卡了主线程求破 - V2EX
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
kobe1941
V2EX    iDev

CoreText 进行图文混排时卡了主线程求破

  •  
  •   kobe1941 2015 年 7 月 20 日 5651 次点击
    这是一个创建于 3839 天前的主题,其中的信息可能已经有所发展或是发生改变。
    题主在使用CoreText控件进行图文混排。图片主要是自定义的表情,尺寸比一般文字的高度要大一些,所以在计算该控件的高度时,每次都需要生成ctFrame然后遍历每一行判断该行是否有表情图片,来累加计算该控件的高度。然后卡主了主线程,通过debug已找到卡主线程的原因就在于这个控件计算高度时每次都创建ctFrame这一个环节,求助V友,有什么方法可以简化计算高度的方法吗?

    由于是表情图片,比系统的emoji尺寸大,所以我才每次都会去创建ctFrame进行遍历的。

    补充:并不是每次发表情图片都会卡,是当用户一次性发几十个表情时,会卡住,且卡在控件计算高度那里,并不是drawRect绘制方法里。
    20 条回复    2015-07-21 09:53:46 +08:00
    nullcc
        1
    nullcc  
       2015 年 7 月 20 日
    没看过你的代码不是很清楚,参考我以前写的这方面的代码,计算高度的时候创建的typesetter要记得CFRelease掉,另外要在主线程里setNeedsDisplay。
    wdxz5586
        2
    wdxz5586  
       2015 年 7 月 20 日   1
    CoreText 和 CoreGraphics 都是线程安全的,可以不在主线程做排版和渲染。AsyncDisplayKit 很优雅地封装了这种操作,可以参考参考。
    kobe1941
        3
    kobe1941  
    OP
       2015 年 7 月 20 日
    @nullcc 你以前的代码在哪里?能给个链接吗
    nullcc
        4
    nullcc  
       2015 年 7 月 20 日
    @kobe1941 公司的代码,可能不大方便给出,不过 @wdxz5586 说的提醒我了,确实是这样。
    nullcc
        5
    nullcc  
       2015 年 7 月 20 日
    唐巧有写过一个coretext排版引擎,开源的,可以参考下
    yfmir
        6
    yfmir  
       2015 年 7 月 20 日
    可以尝试UILabel + NSAttributedString
    chmlai
        7
    chmlai  
       2015 年 7 月 20 日
    简单的就是在后台把要显示的东西绘制到一个图片上去然后 dispatch 到UI 线程显示图片就行了.
    joeytat
        8
    joeytat  
       2015 年 7 月 20 日
    只是表情的话,NSAttributedString + NSTextAttachment 就可以了。之前撸过一个类似的小东西 https://github.com/joeytat/JTATEmoji
    kobe1941
        9
    kobe1941  
    OP
       2015 年 7 月 20 日
    @joeytat
    @yfmir 是自定义表情,不是系统表情,所以必须自己重绘。
    kobe1941
        10
    kobe1941  
    OP
       2015 年 7 月 20 日
    @wdxz5586
    @nullcc 正在研究AsyncDisplayKit,感谢两位,唐巧的教程看过了,没讲优化,只解释了基本绘制原理。
    kobe1941
        11
    kobe1941  
    OP
       2015 年 7 月 20 日
    @chmlai 绘制到UIView之前要先根据数据计算该控件的高度,我就卡在这里,还在研究ing
    qq2511296
        12
    qq2511296  
       2015 年 7 月 20 日   1
    @kobe1941 自定义表情也可以用NSTextAttachment 就一张小图片而已 NSTextAttachment可以插入图片
    ibremn
        13
    ibremn  
       2015 年 7 月 20 日
    所有能后台线程完成的操作,都放到后台线程去做。

    拿显示微博举个例子:
    1.发起网络请求,开始转圈圈。
    2. 获取到JSON数据后,在后台线程里解析成数据模型,随后创建CoreText对象、计算每个Cell的高度,保存到一个中间模型去(比如每个 Cell 对应一个 CellLayout)。
    3.停止转圈圈,更新 TableView。
    4.在 Cell 需要更新时,传入 CellLayout 来显示。
    5.在需要绘制文本时,先清空文本 label.layer.contents, 在后台线程创建 BitmapContext,用CoreText绘制为图片,然后转到主线程来把图片更新到 label.layer.contents 去。

    或者。。直接用 AsyncDisplayKit 吧。。原理类似。。
    kobe1941
        14
    kobe1941  
    OP
       2015 年 7 月 20 日
    @ibremn 感谢大神,我按照你的思路继续研究。
    目测活捉某浪工程师一枚?
    zythum
        15
    zythum  
       2015 年 7 月 20 日
    @ibremn 下次用微信举例子....
    ibremn
        16
    ibremn  
       2015 年 7 月 20 日
    @kobe1941 咦?举个例子而已,我又不是渣浪的 ( ̄ ̄")
    kobe1941
        17
    kobe1941  
    OP
       2015 年 7 月 20 日
    @ibremn 好吧,不过引出一枚某浪工程师 @zythum
    loveuqian
        18
    loveuqian  
       2015 年 7 月 20 日 via iPhone
    今天才刚学自定义cell。。。
    joeytat
        19
    joeytat  
       2015 年 7 月 20 日
    @kobe1941 我发的 git repo 链接里面就是自定义表情的实现啊,iOS 又没有 QQ 表情……
    kobe1941
        20
    kobe1941  
    OP
       2015 年 7 月 21 日
    @joeytat 好,我研究研究,多谢
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3151 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 36ms UTC 12:50 PVG 20:50 LAX 04:50 JFK 07:50
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86