永发信息网

知乎的ios app里面的图文混排是怎么实现的,是加载的html吗

答案:1  悬赏:40  手机版
解决时间 2021-11-15 20:24
知乎的ios app里面的图文混排是怎么实现的,是加载的html吗
最佳答案
iOS实现图文混排的两个方法
  如果你想自定义文本的布局,例如像QQ、微信这样的应用中使用表情,那你多半会用到CoreText,CoreText是iOS、OSX平台的文本处理低层的框架, 可以实现任意的文字编排,更多详细信息请戳官方文档,一般来说, 我们们用下面的代码来实现图文混排:


  text = [[NSMutableAttributedString alloc] initWithString:@""];
  NSAttributedString *txt1 = [[NSAttributedString alloc] initWithString:@"测试"];
  [text appendAttributedString:txt1];
  [txt1 release];
  CTRunDelegateCallbacks callback;
  callback.version = kCTRunDelegateVersion1; //必须指定,否则不会生效,没有回调产生。
  callback.dealloc = deallocCallback;
  callback.getAscent = getAscent;
  callback.getDescent = getDescent;
  callback.getWidth = getWidth;
  NSDictionary *imgAttr = [[NSDictionary dictionaryWithObjectsAndKeys:@100, @"width", nil] retain];
  CTRunDelegateRef delegate = CTRunDelegateCreate(&callback, imgAttr);
  NSDictionary *txtDelegate = [NSDictionary dictionaryWithObjectsAndKeys:(id)delegate, (NSString*)kCTRunDelegateAttributeName, @100, @"width", nil];
  NSAttributedString *imgField = [[[NSAttributedString alloc] initWithString:@" " attributes:txtDelegate] autorelease];
  [text appendAttributedString:imgField];
  [text appendAttributedString:[[[NSAttributedString alloc] initWithString: @"结束"] autorelease]];
  CGMutablePathRef pathRef = CGPathCreateMutable();
  CGPathAddRect(pathRef, NULL, CGRectMake(0, 0, self.frame.size.width, self.frame.size.height));
  framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)text);
  ctFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), pathRef, NULL);
  CFArrayRef lines = CTFrameGetLines(ctFrame);
  CGPoint origins[CFArrayGetCount(lines)];
  CTFrameGetLineOrigins(ctFrame, CFRangeMake(0, 0), origins);
  for (int i = 0; i < CFArrayGetCount(lines); i++) {
  CTLineRef line = CFArrayGetValueAtIndex(lines, i);
  CFArrayRef runs = CTLineGetGlyphRuns(line);
  for (int j = 0; j < CFArrayGetCount(runs); j++) {
  CTRunRef run = CFArrayGetValueAtIndex(runs, j);
  CGPoint lineOrigin = origins[i];
  NSDictionary *meta = (NSDictionary*)CTRunGetAttributes(run);
  if (meta && ([meta valueForKey:@"width"] != nil)) {
  imageLocation.y = lineOrigin.y;
  CGFloat offset = CTLineGetOffsetForStringIndex(line, CTRunGetStringRange(run).location, NULL);
  imageLocation.x = lineOrigin.x + offset + self.frame.origin.x;
  }
  }
  }
  CFRelease(pathRef);
  [self setNeedsDisplay];




  一直以来,我认为只有这种方法实现。好吧,其实我没有想过有没有其它实现方法的问题。直到有一天看类似效果的代码时惊奇的发现:怎么 没有CTRunDelegate? 于是就仔细想了一下这个问题,创建CTFrame的时候会指定一个path,通常这个path我会使用一个CGRect完事,然后在 有图片的地方使用CTRunDelegate处理一下,但其实完全可以使用CGMutablePath来画出一块不规则的文本路径,比如:这样,就可以在预定的位置画图片了,而不用会CTRunDelegate来特殊处理,这种方式比较适合图片位置固定的应用。


转自madongsheng
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
魔剑生死棋
以知数列an的前n项和sn等于3的n加1次方减3求a
一个43岁的男人总是喜欢大自己十几岁的女人,
4+64版本的红米Note5和小米6X哪个比较好
北京地铁安河桥北站到香山的公交路线
跪求团组织生活心得,主要是两个班联谊互动活
无锡中储家舍什么时候拆
惠普wasd 17-w119tx怎么样
七波辉2019年春夏新品的订货会什么时候开始?
氩弧焊焊接有什么好处
我户口在宜都,可以在松滋上车牌吗?
租客恶意拖欠租金 房东是否有权解除租赁合同
求助帖,大家升级炮姐技能
有没有一些输入命令的游戏 好像 两个酒吧女郎
其利不足,利其所得, 得不偿失,乃下下策,这
推荐资讯
什么是阳,什么是阴,什么是阴阳结合
鼓属于什么乐器
147×148-146×149怎样巧算
一个月右边一个梭的右边那个是什么字?
香港的资料有哪些?
环评验收时7个废气排口,企业可以扩建废气排
剑麻与龙舌兰是一样的吗
直道而事入 何往而不做黜
云兵特产店地址在什么地方,我要处理点事!
下列各句中,标点符号使用正确的一句是 A
我想知道密速提和V美减龄哪个见效快?
1.25×17.6+36÷8+2.64×12.5简便计算要思路
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?