Mam niestandardowego UIView, który jest rysunek NSString poprzez CoreText:NSString boundingRectWithSize wysokość skrócania z Coresetext Framesetter? iOS
- (NSMutableAttributedString *)getAttributedString : (NSString *)displayText {
string = [[NSMutableAttributedString alloc]
initWithString:displayText];
helvetica = CTFontCreateWithName(CFSTR("Helvetica"), 20.0, NULL);
[string addAttribute:(id)kCTFontAttributeName
value:(__bridge id)helvetica
range:NSMakeRange(0, [string length])];
return string;
}
- (void)drawRect:(CGRect)rect
{
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(
(__bridge CFAttributedStringRef)string);
// left column form
leftColumnPath = CGPathCreateMutable();
CGPathAddRect(leftColumnPath, NULL,
CGRectMake(0, 0,
self.bounds.size.width,
self.bounds.size.height));
// left column frame
textleftFrame = CTFramesetterCreateFrame(framesetter,
CFRangeMake(0, 0),
leftColumnPath, NULL);
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
// right column form
rightColumnPath = CGPathCreateMutable();
CGPathAddRect(rightColumnPath, NULL,
CGRectMake(self.bounds.size.width/2.0, 0,
self.bounds.size.width/2.0,
self.bounds.size.height));
NSInteger rightColumStart = CTFrameGetVisibleStringRange(textleftFrame).length;
// right column frame
textrightFrame = CTFramesetterCreateFrame(framesetter,
CFRangeMake(rightColumStart, 0),
rightColumnPath,
NULL);
}
// flip the coordinate system
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetTextMatrix(context, CGAffineTransformIdentity);
CGContextTranslateCTM(context, 0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
// draw
CTFrameDraw(textleftFrame, context);
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
CTFrameDraw(textrightFrame, context);
}
// cleanup
CFRelease(textleftFrame);
CGPathRelease(leftColumnPath);
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
CFRelease(textrightFrame);
CGPathRelease(rightColumnPath);
}
CFRelease(framesetter);
CFRelease(helvetica);
CFRelease(helveticaBold);
}
innej klasy Mam następnie próbuje użyć boundingRectWithSize obliczyć, jak długo widok będzie wyświetlany tekst (I potem ustawić a UIScrollView, aby dopasować to):
NSMutableAttributedString * attributedString = [textView getAttributedString:text];
// Code here for iOS 7.0 - sizeWithFont is deprecated.
CGRect textBoxSize = [attributedString boundingRectWithSize:CGSizeMake(315.f, CGFLOAT_MAX) options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading) context:nil];
textView.frame = CGRectMake(textView.frame.origin.x, pictureSpace, textBoxSize.size.width, textBoxSize.size.height);
Metoda getAttributedString jest powyżej. Problem polega na tym, że tekstView jest nieco za krótki i dlatego odcina ostatnią linię tekstu. Czy ktoś może sugerować, co jest nie tak?
Co więcej, na marginesie, dlaczego rozmiar w borderingRectWithSize musi być 315 (czyli nieco krótszy niż szerokość ekranu) zamiast 320, aby zadziałał? W 320 tekstViewView jest nieco zbyt szeroki dla ekranu.
Edycja - wydaje się, że dzieje się tak tylko w przypadku niektórych czcionek - np. Verdana działa poprawnie. Czy ktoś bardziej kompetentny wie, czy to ma coś wspólnego z glifami?
Dzięki!
W jaki sposób różne odstępy między wierszami pasują do kodu, aby uzyskać odpowiedni rozmiar? Zmagałem się z tą kwestią rozmiarów (używając tableview) również w ciągu ostatnich kilku miesięcy i to jest pierwszy trop, jaki widziałem. – guthook
Spróbuj zmienić typ czcionki - wydaje się, że dzieje się tak tylko w przypadku niektórych czcionek. – GuybrushThreepwood
Fajnie, dziękuję za informację. Spojrzałem trochę dalej i znalazłem to, co może pomóc: http://stackoverflow.com/a/18818036/1275947 – guthook