2010-07-12 16 views
42

Tengo un UITextView para edición de texto. Por defecto, tiene un pequeño margen alrededor del texto. Quiero aumentar ese margen en unos pocos píxeles.Cómo establecer los márgenes (relleno) en UITextView?

La propiedad contentInset me da márgenes, pero no cambia el texto "ancho de envoltura". El texto está envuelto en el mismo ancho, y el "margen" adicional solo hace que la vista se desplace horizontalmente.

¿Hay alguna manera de hacer que una UITextView de cierto ancho muestre el texto con un ancho de envolvente más estrecho?

Respuesta

7

Puede usar un UITextView más pequeño y colocar un UIView en segundo plano para simular el relleno.

+----------+ 
|   | <-- UIView (as background) 
| +--+ | 
| | | <---- UITextView 
| | | | 
| +--+ | 
|   | 
+----------+ 
+1

Sí, eso es lo que estoy haciendo ahora. Funciona bien para los márgenes laterales, pero el margen superior tiene problemas. Desde la perspectiva del usuario, el texto se "corta" en la parte superior mientras se desplaza porque el texto solo se representa en UITextView. – strawtarget

+5

Y no se puede mostrar correctamente la barra de desplazamiento vertical de esta manera. – an0

+0

Configuración 'textView.clipsToBounds = NO'" arreglará "el corte en la parte superior, más o menos. Por supuesto, esto no ayudará a mostrar correctamente la barra de desplazamiento vertical. – villapossu

1

Esto funciona para mí. Cambiar el contenido de TextView Inserte y encuadre el recuadro/posición para obtener el acolchado y el ajuste de palabras correctos. Luego, cambie los límites de textView para evitar el desplazamiento horizontal. También necesita restablecer el relleno cada vez que se selecciona y cambia el texto.

- (void)setPadding 
{ 
    UIEdgeInsets padding = UIEdgeInsetsMake(30, 20, 15, 50); 

    textView.contentInset = padding; 

    CGRect frame = textView.frame; 

    // must change frame before bounds because the text wrap is reformatted based on frame, don't include the top and bottom insets 
    CGRect insetFrame = UIEdgeInsetsInsetRect(frame, UIEdgeInsetsMake(0, padding.left, 0, padding.right)); 

    // offset frame back to original x 
    CGFloat offsetX = frame.origin.x - (insetFrame.origin.x - (padding.left + padding.right)/2); 
    insetFrame = CGRectApplyAffineTransform(insetFrame, CGAffineTransformMakeTranslation(offsetX, 0)); 

    textView.frame = insetFrame; 

    textView.bounds = UIEdgeInsetsInsetRect(textView.bounds, UIEdgeInsetsMake(0, -padding.left, 0, -padding.right)); 

    [textView scrollRectToVisible:CGRectMake(0,0,1,1) animated:NO]; 
} 

-(void)textViewDidChangeSelection:(UITextView *)textView 
{ 
    [self setPadding]; 
} 

-(void)textViewDidChange:(UITextView *)textView 
{ 
    [self setPadding]; 
} 
+0

@Nate esto no funciona para mí. La vista de texto sigue desplazándose horizontalmente y el contenido del recuadro se vacía fuera del marco de la vista de texto – GoGreen

34

Después de perder el tiempo con esto durante un tiempo me encontré otra solución si sólo está en desarrollo para iOS 6. Ajuste los márgenes superior e inferior con contentInset:

textView = [[UITextView alloc] init]; 
textView.contentInset = UIEdgeInsetsMake(20.0, 0.0, 20.0, 0.0); 

Para la izquierda y los márgenes derechos no agregan el texto sin formato de inmediato, pero use un NSAttributedString en su lugar con las sangrías adecuadas para la izquierda y la derecha con un NSMutableParagraphStyle:

NSMutableParagraphStyle *paragraphStyle = [[NSMutableParagraphStyle alloc] init]; 
paragraphStyle.headIndent = 20.0; 
paragraphStyle.firstLineHeadIndent = 20.0; 
paragraphStyle.tailIndent = -20.0; 

NSDictionary *attrsDictionary = @{NSFontAttributeName: [UIFont fontWithName:@"TrebuchetMS" size:12.0], NSParagraphStyleAttributeName: paragraphStyle}; 
textView.attributedText = [[NSAttributedString alloc] initWithString:myText attributes:attrsDictionary]; 

Esto le da una UITextView con el texto (en mi caso de la variable myText) con 20 píxeles de relleno que se desplaza correctamente.

89

A partir de iOS 7 puede utilizar textContainerInset propiedad:

Objective-C

textView.textContainerInset = UIEdgeInsetsMake(0, 20, 0, 20); 

Swift

textView.textContainerInset = UIEdgeInsets(top: 0, left: 20, bottom: 0, right: 20) 
8

Prueba este

UIBezierPath* aObjBezierPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, 20, 20)]; 
txtView.textContainer.exclusionPaths = @[aObjBezierPath]; 
0

Gracias por las sugerencias. he tenido este problema al desarrollar una aplicación macOS/OSX y terminé con esto:

textView.textContainerInset = NSSize(width: 20, height: 20); //Sets margins 
0

Try continuación Código

Para utilizar iOS7 textContainerInset

Textview.textContainerInset = UIEdgeInsetsMake (0, 20, 0, 20);

comprueban debajo de acoplamiento que podría ser útil para usted

https://stackoverflow.com/a/22935404/5184217

Cuestiones relacionadas