Ich habe eine benutzerdefinierte UIView, die eine NSString über Core zeichnet:NSString boundingRectWithSize Schnitthöhe kurz mit CoreText 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);
}
In einer anderen Klasse ich dann versuche boundingRectWithSize zu verwenden, um zu berechnen, wie lange die Ansicht, um den Text anzuzeigen wird (ich später dann eingestellt a UIScrollView dies entsprechen):
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);
getAttributedString Die oben beschriebene Methode ist. Das Problem ist, dass textView in der Höhe etwas zu kurz ist und deshalb die letzte Textzeile abschneidet. Kann jemand vorschlagen, was falsch ist?
Auch, nebenbei bemerkt, warum muss die Größe in BoundingRectWithSize 315 (d. H. Etwas kürzer als die Bildschirmbreite) statt 320 sein, um zu arbeiten? Bei 320 endet der textView etwas zu weit für den Bildschirm.
Bearbeiten - dies scheint nur bei bestimmten Schriftarten passieren - z. B. Verdana funktioniert gut. Weiß jemand, der besser weiß, ob das etwas mit Glyphen zu tun hat?
Danke!
Wie funktioniert die unterschiedlichen Zeilenabstand in den Code passen die richtige Größe zu bekommen? Ich habe mich auch in den letzten Monaten mit diesem Dimensionierungsproblem (mit Tabellenansichten) herumgeschlagen und dies ist der erste Anhaltspunkt, den ich gesehen habe. – guthook
Versuchen Sie, die Schriftart zu ändern - es scheint nur bei bestimmten Schriftarten zu passieren. – GuybrushThreepwood
Cool, danke für die Info. Ich sah ein wenig mehr und fand das, was helfen könnte: http://Stackoverflow.com/a/18818036/1275947 – guthook