0
UILabel의 sizeThatFits 메소드를 사용하지 않고 내 맞춤 레이블에서 텍스트 rect를 계산해야합니다. 아래 코드가 올바르게 작동하지 않습니다. 주요 아이디어는 index = numberOfLines - 1에서 CTLine을 찾고 max y 위치를 반환하는 것입니다. 그러나 텍스트 높이가 때로는 너무 커서 때로는 마지막 줄을 그리기에 충분하지 않습니다.너비와 numberOfLines에 의해 NSAttributedString 높이가 제한됩니다.
- (CGSize)fittingSizeWithSize:(CGSize)size numberOfLines:(NSInteger)numberOfLines {
if (numberOfLines == 0) {
return [self fittingSizeWithSize:size];
}
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)self);
if (framesetter == NULL) {
return CGSizeZero;
}
CGPathRef path = CGPathCreateWithRect(CGRectMake(0,0,size.width,size.height), NULL);
CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, self.length), path, NULL);
NSArray *lines = (NSArray *) CTFrameGetLines(frame);
if (lines.count == 0) {
return CGSizeZero;
}
NSUInteger lineIndex = MIN((NSUInteger)numberOfLines, lines.count) - 1;
CTLineRef line = (__bridge CTLineRef) lines[lineIndex];
CGPoint origins[[lines count]];
CTFrameGetLineOrigins(frame, CFRangeMake(0, 0), origins);
CGAffineTransform transform = CGAffineTransformMakeTranslation(0, size.height);
transform = CGAffineTransformScale(transform, 1, -1);
CGRect lineRect;
CGFloat ascent;
CGFloat descent;
lineRect.size.width = (CGFloat)CTLineGetTypographicBounds(line, &ascent, &descent, NULL); //8
lineRect.size.height = ascent + descent;
lineRect.origin.y = CGPointApplyAffineTransform(origins[lineIndex], transform).y;
CGFloat height = CGRectGetMaxY(lineRect);
CFRelease(path);
CFRelease(framesetter);
return CGSizeMake(size.width, height);
}
NSAttributedString은이 범주는 내가 아무 생각이 내 실수가없는 내 UILabel의 서브 클래스
@implementation SMBDLabel
- (void)drawTextInRect:(CGRect)rect {
if (self.attributedText) {
CGContextRef ctx = UIGraphicsGetCurrentContext();
[self.attributedText drawInContext:ctx viewBounds:rect];
} else {
[super drawTextInRect:rect];
}
}
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines {
CGSize size = [self.attributedText fittingSizeWithSize:bounds.size numberOfLines:numberOfLines];
return CGRectMake(0, 0, size.width, size.height);
}
- (CGSize)sizeThatFits:(CGSize)size {
return [self.attributedText fittingSizeWithSize:size numberOfLines:self.numberOfLines];
}
@end
에 사용됩니다. 어쩌면 UILabel 서브 클래스에서 실수를했을 수도 있습니다.
사용하는 이유 코어 텍스트, NSAttributedString은 이미'boundingRectWithSize이있는 경우 : 옵션 : 컨텍스트를'? – matt
NSTextAttachment (줄 바꿈 및 사용 가능한 해결 방법 버그가 있음)를 사용할 수없는 것은 물론 사용자 지정 이미지 첨부 파일을 그립니다. UILabel을 UIView의 하위 클래스로 대체해도 문제가 있습니다. – Arsynth
나는 이것을 따르고 있지 않다. 지금 텍스트 키트가 있습니다. 핵심 텍스트가 필요한 것은 아닙니다. 또한 UITextView를 사용하면 Text Kit을 직접 사용할 수 있으며 UILabel의 동작을 시뮬레이션 할 수 있습니다. – matt