iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iphone – 向NSString添加省略号大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码,我试图使用核心文本绘制,这就是为什么我不能像UILabel那样剪切文本.换句话说,我必须弄清楚我自己的省略号(‘…’).

CGSize commentSize = [[self.sizeDictionary_ valueForKey:commentSizeKey] CGSizeValue];
        CGSize actualSize = [[self.sizeDictionary_ valueForKey:actualCommentSizeKey] CGSizeValue];

 NSString *actualComment = self.highlightItem_.comment;
        if (actualSize.height > commentSize.height){
            actualComment = [self.highlightItem_.comment StringByreplacingCharactersInRange:NsmakeRange(68,3) withString:@"..."];
        }

我很难找到基于CGSize的’…’的范围.解决这个问题的最佳方法是什么?

这是我绘制它的方式:

CFStringRef String = CFBridgingRetain(actualComment);
        CFMutableAttributedStringRef comment = CFAttributedStringCreateMutable(kcfAllocatorDefault,0);
        CFAttributedStringreplaceString (comment,CFRangeMake(0,0),String);

        CGColorRef blue = CGColorRetain([UIColor colorWithRed:131/255.f green:204/255.f blue:253/255.f alpha:1.0].CGColor);
        CGColorRef gray = CGColorRetain([UIColor colorWithWhite:165/255.f alpha:1.0].CGColor);

        CFAttributedStringSetAttribute(comment,[name length]),kCTForegroundColorAttributename,bluE);
        CFAttributedStringSetAttribute(comment,CFRangeMake([name length],[self.highlightItem_.comment length] - [name length]),gray);

        CGColorRelease (bluE);
        CGColorRelease (gray);

        CTFontRef nameFont = CTFontCreateWithName(CFBridgingRetain(kProximaNovaBold),13.0f,nil);
        CFAttributedStringSetAttribute(comment,kCTFontAttributename,nameFont);

        CTFontRef commentFont = CTFontCreateWithName(CFBridgingRetain(kProximaNovaRegular),commentFont);

        CGFloat commentYOffset = floorf((self.commentHeight_ - commentSize.height)/2);

        CGContextSaveGState(context);
        CGRect captionFrame = CGRectMake(0,rect.size.width - 80,commentSize.height);
        CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(comment);
        CGMutablePathRef captionFramePath = CGPathCreateMutable();
        CGPathAddRect(captionFramePath,NULL,captionFramE);

        CTFrameRef mainCaptionFrame = CTFramesetterCreateFrame(framesetter,captionFramePath,null);

        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetTextMatrix(context,CGAffineTransformIdentity);
        CGContextTranslateCTM(context,self.buttonSize_ + 25,self.imageHeight_ + self.commentHeight_ + 6 - commentYOffset);
        CGContextScaleCTM(context,1.0,-1.0);

        CTFrameDraw(mainCaptionFrame,context);
        CGContextRestoreGState(context);

解决方法

编辑

(我在这里的原始答案没有用;它没有处理多行.如果有人想看到它的历史兴趣,请查看编辑历史.我删除了它,因为它导致比它解决的更多混乱.答案是正确的代码.)

你需要做的是让CTFramesetter解决除最后一行之外的所有行.然后,如果需要,您可以手动截断最后一个.

- (void)drawRect:(CGRect)rect
{
  CGContextRef context = UIGraphicsGetCurrentContext();
  CGContextSetTextMatrix(context,CGAffineTransformIdentity);

  CGRect pathRect = CGRectMake(50,200,40);
  CGPathRef path = CGPathCreateWithRect(pathRect,null);

  CFAttributedStringRef attrString = (__bridge CFTypeRef)[self attributedString];

  // Create the framesetter using the attributed String
  CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(attrString);

  // Create a single frame using the entire String (CFRange(0,0))
  // that fits inside of path.
  CTFrameRef frame = CTFramesetterCreateFrame(framesetter,path,null);

  // Draw the lines except the last one
  CFArrayRef lines = CTFrameGetLines(framE);
  CFIndex lineCount = CFArrayGetCount(lines);
  CGPoint origins[lineCount]; // I'm assuming that a stack variable is safe here.
                              // This would be bad if there were thousdands of lines,but that's unlikely.
  CTFrameGetLineOrigins(frame,origins);
  for (CFIndex i = 0; i < lineCount - 1; ++i) {
    CGContextSetTextPosition(context,pathRect.origin.x + origins[i].x,pathRect.origin.y + origins[i].y);
    CTLineDraw(CFArrayGetValueATindex(lines,i),context);
  }

  ///
  /// HERE'S THE intERESTinG PART
  ///
  // Make a new last line that includes the rest of the String.
  // The last line is already truncated (just with no truncation mark),so we can't truncate it again
  CTLineRef lastLine = CFArrayGetValueATindex(lines,lineCount - 1);
  CFIndex lastLOCATIOn = CTLineGetStringRange(lastLinE).LOCATIOn;
  CFRange restRange = CFRangeMake(lastLOCATIOn,CFAttributedStringGetLength(attrString) - lastLOCATIOn);
  CFAttributedStringRef restOfString = CFAttributedStringCreateWithSubString(NULL,attrString,restRangE);
  CTLineRef restLine = CTLineCreateWithAttributedString(restOfString);


  // We need to provide the truncation mark. This is an ellipsis (Cmd-semicolon).
  // You Could also use "\u2026". Don't use dot-dot-dot. It'll work,it's just not correct.
  // ObvIoUsly you Could cache this…
  CTLineRef ellipsis = CTLineCreateWithAttributedString((__bridge CFTypeRef)
                                                        [[NSAttributedString alloc] initWithString:@"…"]);

  // OK,Now let's truncate it and draw it. I'm being a little sloppy here. If ellipsis Could possibly
  // be wider than the path width,then this will fail and truncateLine will be NULL and we'll crash.
  // Don't do that.
  CTLineRef truncatedLine = CTLineCreateTruncatedLine(restLine,CGRectGetWidth(pathRect),kCTLineTruncationEnd,ellipsis);
  CGContextSetTextPosition(context,pathRect.origin.x + origins[lineCount - 1].x,pathRect.origin.y + origins[lineCount - 1].y);
  CTLineDraw(truncatedLine,context);

  CFRelease(truncatedLinE);
  CFRelease(ellipsis);
  CFRelease(restLinE);
  CFRelease(restOfString);
  CFRelease(framE);
  CFRelease(framesetter);
  CGPathRelease(path);
}

大佬总结

以上是大佬教程为你收集整理的iphone – 向NSString添加省略号全部内容,希望文章能够帮你解决iphone – 向NSString添加省略号所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。