Quiero agregar números de línea a mi UITextView
.
¿Tengo que escribir mi propio elemento UI o hay alguna otra solución?¿Cómo agregar números de línea a una UITextView?
15
A
Respuesta
9
lo logré subclasificando UIView
y reemplazando el método drawRect:
así:
#define TXT_VIEW_INSETS 8.0 // The default insets for a UITextView is 8.0 on all sides
@implementation NumberedTextView
@synthesize lineNumbers;
@synthesize delegate;
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
[self setContentMode:UIViewContentModeRedraw];
internalScrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
[internalScrollView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[internalScrollView setBackgroundColor:[UIColor clearColor]];
[internalScrollView setClipsToBounds:YES];
[internalScrollView setScrollsToTop:YES];
[internalScrollView setContentSize:self.bounds.size];
[internalScrollView setContentMode:UIViewContentModeLeft];
[internalScrollView setDelegate:self];
[internalScrollView setBounces:NO];
internalTextView = [[UITextView alloc] initWithFrame:self.bounds];
[internalTextView setAutocapitalizationType:UITextAutocapitalizationTypeNone];
[internalTextView setAutocorrectionType:UITextAutocorrectionTypeNo];
[internalTextView setSpellCheckingType:UITextSpellCheckingTypeNo];
[internalTextView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
[internalTextView setBackgroundColor:[UIColor clearColor]];
[internalTextView setClipsToBounds:YES];
[internalTextView setScrollsToTop:NO];
[internalTextView setContentMode:UIViewContentModeLeft];
[internalTextView setDelegate:self];
[internalTextView setBounces:NO];
[internalScrollView addSubview:internalTextView];
[self addSubview:internalScrollView];
}
return self;
}
- (void)drawRect:(CGRect)rect {
if (self.lineNumbers) {
[[internalTextView textColor] set];
CGFloat xOrigin, yOrigin, width/*, height*/;
uint numberOfLines = (internalTextView.contentSize.height + internalScrollView.contentSize.height)/internalTextView.font.lineHeight;
for (uint x = 0; x < numberOfLines; ++x) {
NSString *lineNum = [NSString stringWithFormat:@"%d:", x];
xOrigin = CGRectGetMinX(self.bounds);
yOrigin = ((internalTextView.font.pointSize + abs(internalTextView.font.descender)) * x) + TXT_VIEW_INSETS - internalScrollView.contentOffset.y;
width = [lineNum sizeWithFont:internalTextView.font].width;
// height = internalTextView.font.lineHeight;
[lineNum drawAtPoint:CGPointMake(xOrigin, yOrigin) withFont:internalTextView.font];
}
CGRect tvFrame = [internalTextView frame];
tvFrame.size.width = CGRectGetWidth(internalScrollView.bounds) - width;
tvFrame.size.height = MAX(internalTextView.contentSize.height, CGRectGetHeight(internalScrollView.bounds));
tvFrame.origin.x = width;
[internalTextView setFrame:tvFrame];
tvFrame.size.height -= TXT_VIEW_INSETS; // This fixed a weird content size problem that I've forgotten the specifics of.
[internalScrollView setContentSize:tvFrame.size];
}
}
#pragma mark - UITextView Delegate
- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
[self setNeedsDisplay];
return YES;
}
- (void)textViewDidChange:(UITextView *)textView {
[self setNeedsDisplay];
}
- (void)textViewDidChangeSelection:(UITextView *)textView {
[self setNeedsDisplay];
}
#pragma mark - UIScrollView Delegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self setNeedsDisplay];
}
-2
No hay nada incorporado para esto. Tendrás que hacerlo tú mismo.
+8
Podría ser más fácil a la subclase UITextView y editar los métodos de dibujo allí, aunque probablemente será una tarea desde cualquier ángulo. – JoePasq
Cuestiones relacionadas
- 1. cómo agregar números de líneas a: QTextEdit?
- 2. Agregar sombra paralela a UIWebView y UITextView
- 3. ¿Cómo puedo agregar números de fila a una grilla ExtJS?
- 4. Cómo llegar altura de una línea en UITextView
- 5. Agregar números de línea al código fuente en vim
- 6. ¿Cómo puedo agregar números de línea no seleccionables por el mouse a vim?
- 7. Conjunto altura de la línea de UITextView
- 8. Cómo pasar el tacto de una UITextView a una UITableViewCell
- 9. Xcode cómo autoencoger una UITextView?
- 10. Cómo agregar una nueva línea a JLabel sin usar HTML
- 11. Cómo aplicar sombra de texto a UITextView?
- 12. Agregar números juntos
- 13. ¿Cómo evalúa PHP() los números de línea?
- 14. ¿Cómo puedo agregar comas a los números en PHP
- 15. ¿Cómo puedo agregar números no secuenciales a un rango?
- 16. Cómo agregar cadenas a la misma línea en lugar de crear una nueva línea?
- 17. ¿Cómo agregar números en una matriz mutable en iphone?
- 18. HTML que agrega números de línea a textarea
- 19. UITextView (edición): detectar que ocurrió el siguiente evento de línea
- 20. lectura de dos números enteros en una línea usando C#
- 21. Agregar a una ICollection
- 22. ¿Agregar una nueva línea en el archivo?
- 23. Cómo deshabilitar el teclado en una UITextView?
- 24. Números de Fibonacci, con una línea en Python 3?
- 25. Menos: Mostrar números de línea, números de archivo y línea de origen en CSS procesado
- 26. ¿Cómo convertir una cadena de números separados por comas a una matriz de números enteros?
- 27. Números de línea incorrectos de addr2line
- 28. ¿Qué significa agregar esta línea a web.config?
- 29. Rubymine: habilite los números de línea
- 30. cómo puedo agregar Agregar texto al comienzo de cada línea?
Gracias por compartir el código. Para su información, para otras personas que lo intentan, no tiene en cuenta el ajuste de palabras, por lo que los números de línea son solo un recuento visual de las líneas, no líneas reales en el texto. – Philosophistry
@Philosophistry Gracias por señalar esto; Me olvidé de mencionar eso. Este código no trata con el ajuste de línea porque en el método 'layoutSubviews' me aseguro de que' internalScrollView' y 'internalTextView' sean lo suficientemente anchos para ajustarse a la línea de texto más larga sin ajustar (de hecho, ajusto el ancho de los marcos cuando' internalTextView' el contenido de texto cambia, pero las comprobaciones dobles de 'layoutSubviews' para asegurarse de que sean lo suficientemente amplias). Esto fue intencional porque tratar de hacer funcionar la numeración de líneas con envoltura hubiera sido un gran dolor de cabeza :). – chown
Tengo un problema extraño: mientras continúo, presione volver en la vista de uitext, se convierte en un espacio grande entre el número de línea y la posición del cursor/cursor usando el mismo código que aquí. ¿Algunas ideas? Gracias –