2012-07-04 6 views
5

Tengo este UITextView que funciona genial, excepto que no puedo obtener el texto dentro del UITextView para comenzar a desplazarme solo después de que el tamaño del UITextView esté casi completo, el UITextView tiene 4 líneas de alto, pero tan pronto como alcanzo la segunda línea, la primera línea se levanta, no quiero que la vista comience a desplazarse hasta que haya alcanzado la línea 5. scrollingEnabled = NO evita que se desplace en absoluto, por lo que no funcionó.¿Cómo puedo obtener el UITextView para desplazarse solo cuando está lleno de texto?

UITextView *barf_ = [[UITextView alloc] initWithFrame:CGRectMake(20.0, 310.0, 155, 50)]; 

barf_.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); 

//[barf_ scrollRangeToVisible:NSMakeRange([barf_.text length], 0)]; 

barf_.layer.cornerRadius = 3.0f; 

barf_.layer.borderWidth = 0.5f; 

barf_.font = [UIFont fontWithName:@"Helvetica" size:13]; 

Respuesta

0

Usted puede utilizar el método sizeWithFont:constrainedToSize:lineBreakMode: para comprobar si su cadena en realidad hacen más grande que su vista de texto y ver si necesita habilitar el desplazamiento. Sin embargo, deberá llamarlo cada vez que se configure el texto en la vista de desplazamiento.

ejemplo:

CGSize barfStringSize = [barfString sizeWithFont:[barf_ font] 
           constrainedToSize:CGSizeMake(barf_.bounds.size.width, MAXFLOAT) 
            lineBreakMode:UILineBreakModeWordWrap] 
[barf_ setScrollEnabled:barfStringSize.height > barf_.bounds.size.height] 
2

Cuando su UITextView se carga conjunto scrollEnabled a NO. A continuación, establezca el delegado de la vista de texto a self o algún otro objeto y poner en práctica el método UITextViewDelegate

- (void)textViewDidChange:(UITextView *)textView 

Este método será llamado cada vez que el usuario realiza un cambio al texto dentro de la vista. Dentro de este método, debe averiguar qué tan grande es su texto y si va más allá de los límites de la vista de texto. Si es así, habilita el desplazamiento. Utilice este método:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode 

Este es un método de categoría UIKit en NSString. Devuelve un CGSize que le indicará la altura de cualquier cadena de texto en la que lo invoque. En su caso, sería algo así como

CGSize textSize = [textView.text sizeWithFont:textView.font 
          constrainedToSize:CGSizeMake(textView.frame.size.width, MAXFLOAT) 
           lineBreakMode:UILineBreakModeWordWrap]; 
if (textSize.height > textView.frame.size.height) { 
    textView.scrollEnabled = YES; 
} else { 
    textView.scrollEnabled = NO; 
} 
2

he encontrado la respuesta, ya que otras personas con problemas similares tienen mención, con una pequeña Textview, se añade automáticamente 32 de relleno en la parte inferior.

Una solución simple es agregar YourTextView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0); dentro del método shouldChangeTextInRange, ¡eso solucionó mi problema!

2

Configurar el contentInset puede ayudar a que el texto aparezca más correctamente en el UITextView. Sin embargo, no ayudará a resolver el problema por el cual el UITextView tiene habilitado el desplazamiento a pesar de no tener más texto para ver.

De forma similar, los métodos como sizeWithFont tienen limitaciones. Como se explica en la excelente serie de blogs de Mike Weller iOS Development: You're Doing It Wrong, NSString no es un buen objeto preguntar acerca de qué tan grande debe ser UIView. Muchas subclases UIView, como UILabel, UIButton, etc. tienen inserciones y otras consideraciones que deben tenerse en cuenta durante el dimensionamiento. UITextLabel no es una excepción.

entrada en particular de Mike Weller sobre este tema es:

You're Doing It Wrong #2: Sizing labels with -[NSString sizeWithFont:...]

iOS 7 nos promete manejo de texto más sofisticados en UITextView, con propiedades tales como textContainerInset. Pero, ¿qué hacer mientras tanto?

Bueno, primero sabemos que UITextView es una subclase de UIScrollView.Por lo tanto, la regla de oro es que si el contentSize es más grande que la propiedad bounds de la vista, la vista de desplazamiento se desplazará para que podamos ver más contenido.

El registro de salida contentSize Agains el bounds no funcionará bien porque sabemos que UIScrollView ya calculando si debe desplazarse o no basado en el texto, y que nos está dando la respuesta equivocada.

¡Aquí es donde los valores arbitrarios de ajuste vienen al rescate! Para mí, este valor era 17.f. Para usted, dependiendo de sus fuentes, puede ser diferente. Luego tomamos el control y decidimos si debemos permitir que la vista de desplazamiento se desplace:

static const CGFloat kArbritaryHeight = 17.f; 
CGFloat adjustedContentHeight = myTextView.contentSize.height - kArbritaryHeight; 
CGFloat boundsHeight = CGRectGetHeight(myTextView.bounds); 
BOOL tooMuchContent = adjustedContentHeight > boundsHeight; 

if (tooMuchContent) 
{ 
    myTextView.scrollEnabled = YES; 
} 
else 
{ 
    myTextView.scrollEnabled = NO; 
} 
Cuestiones relacionadas