por - como poner texto en imovie iphone
iPhone-Cómo dibujar texto en medio de un rect (6)
¿Hay un método para dibujar texto en el centro de un rectángulo. Puedo encontrar varias alineaciones, pero nada de lo que he intentado puede centrar verticalmente el texto en un rect.
¿Hay un método simple para hacer esto, o hay alguna manera de centrar un rectángulo y luego dibujar en eso?
Estoy dibujando directamente al CGContext, tratando de usar NSString :: drawWithRect o algo similar, ya que no quiero tener que agregar una etiqueta solo para representar un texto básico.
Aquí hay una versión actualizada para iOS7.0 +.
También he mejorado la respuesta anterior mediante el uso del método sizeWithAttributes:
que devuelve los límites del texto y le permite sizeWithAttributes:
correctamente antes de dibujarlo. Esto elimina la necesidad de codificar cualquier ajuste que se rompa si usa una fuente de tamaño diferente o si usa una fuente diferente.
- (void) drawString: (NSString*) s
withFont: (UIFont*) font
inRect: (CGRect) contextRect {
/// Make a copy of the default paragraph style
NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
/// Set line break mode
paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
/// Set text alignment
paragraphStyle.alignment = NSTextAlignmentCenter;
NSDictionary *attributes = @{ NSFontAttributeName: font,
NSForegroundColorAttributeName: [UIColor whiteColor],
NSParagraphStyleAttributeName: paragraphStyle };
CGSize size = [s sizeWithAttributes:attributes];
CGRect textRect = CGRectMake(contextRect.origin.x + floorf((contextRect.size.width - size.width) / 2),
contextRect.origin.y + floorf((contextRect.size.height - size.height) / 2),
size.width,
size.height);
[s drawInRect:textRect withAttributes:attributes];
}
En iOS 6 obtienes cadenas de texto y alineaciones de párrafos, por lo que esto se vuelve mucho más directo y poderoso. En este ejemplo, dibujamos una gran "A" roja en el centro de un rectángulo:
NSMutableParagraphStyle* p = [NSMutableParagraphStyle new];
p.alignment = NSTextAlignmentCenter;
NSAttributedString* bigA =
[[NSAttributedString alloc] initWithString:@"A" attributes:@{
NSFontAttributeName: [UIFont fontWithName:@"Georgia" size:100],
NSForegroundColorAttributeName: [UIColor redColor],
NSParagraphStyleAttributeName: p
}];
[bigA drawInRect:CGRectMake(0,0,200,200)];
Estoy de acuerdo con la respuesta de amagrammer, excepto por un pequeño cambio: uso font.lineSize
para obtener la altura adecuada. Supongo que sizeWithFont
le dará el tamaño de línea
He encontrado que este código funciona bastante bien:
NSString *text = @"A bit of text to draw";
UIFont *font = [UIFont systemFontOfSize:12];
CGRect textFrame = (CGRect)
{
.size.width = 150,
.size.height = 150,
};
CGSize textSize = [text sizeWithFont:font constrainedToSize:textFrame.size lineBreakMode:NSLineBreakByWordWrapping];
CGRect newTextFrame = CGRectInset(textFrame, 0, (textFrame.size.height - textSize.height) / 2);
[text drawInRect:newTextFrame withFont:font lineBreakMode:NSLineBreakByWordWrapping alignment:NSTextAlignmentCenter];
El texto, la fuente y el marco que contiene pueden provenir de cualquier lugar, así que solo use el mismo modo de salto de línea cuando haga el cálculo y el dibujo.
Swift 4.2
static func draw(_ text: String, _ rect: CGRect, _ font: UIFont) {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.alignment = .center
let attributes = [
NSAttributedString.Key.paragraphStyle: paragraphStyle,
NSAttributedString.Key.font: font,
NSAttributedString.Key.foregroundColor: UIColor.red
]
NSAttributedString(string: text, attributes: attributes).draw(in: rect.insetBy(dx: 0, dy: (rect.height - font.pointSize)/2))
}
Bueno, la propiedad de fuente pointSize
corresponde directamente a la altura en píxeles de una NSString
dibujada en ese UIFont
, por lo que su fórmula sería algo como esto:
- (void) drawString: (NSString*) s
withFont: (UIFont*) font
inRect: (CGRect) contextRect {
CGFloat fontHeight = font.pointSize;
CGFloat yOffset = (contextRect.size.height - fontHeight) / 2.0;
CGRect textRect = CGRectMake(0, yOffset, contextRect.size.width, fontHeight);
[s drawInRect: textRect
withFont: font
lineBreakMode: UILineBreakModeClip
alignment: UITextAlignmentCenter];
}
UITextAlignmentCenter
maneja el centrado horizontal
, por lo que usamos el ancho completo de contextRect. El lineBreakMode
puede ser lo que quieras.