大佬教程收集整理的这篇文章主要介绍了iphone – 向NSString添加省略号,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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,请注明来意。