fields iphone uitableview uitextview

iphone - fields - text field ios 11



Cómo evitar que UITextView se desplace hacia arriba al ingresarlo (6)

Tengo una UITextView incluida en una UITableViewCell . El diseño es correcto cuando las vistas se muestran inicialmente, pero una vez que hago clic en el UITextView , se desplaza automáticamente un poco y la mitad superior de los caracteres en la primera línea se vuelve invisible.

Esta imagen es cuando el UITextView no está activo:
UITextView no está activo http://gerodt.homeip.net/uitextview-notactive.png

Y este es cuando hice clic en el UITextView para UITextView :
UITextView active http://gerodt.homeip.net/uitextview-active.png

No utilizo UITextView para desplazarme hacia arriba, simplemente debería permanecer fijo. ¿Cómo puedo conseguir esto? Ya probé varias configuraciones en Interface Builder , pero hasta ahora no tuve suerte.

Cualquier sugerencia es apreciada

Gero


Así es como se comporta UITextView de acuerdo con el ingeniero de Apple, esto está destinado y UITextView está destinado a texto que tiene al menos unas pocas líneas de alto. No hay ningún problema con esto, use un UITextField en su lugar o aumente su UITextView a al menos 3 líneas de alto.


Estaba experimentando un problema similar con el desplazamiento UITextView no UITextView . Finalmente logré solucionarlo reiniciando contentSize al final de mi keyboardDidShow:

- (void)keyboardDidShow:(NSNotification *)notification { textView.contentSize = CGSizeZero; }

También necesitará registrarse para la notificación del teclado, así:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

En mi caso, no quería desplazarme desde que estaba restableciendo el marco a la altura del textSize text de textViewDidChange cuando textViewDidChange (creciente textview dentro de UIScrollView ).


Intenta poner Redraw en la vista de texto en lugar de Scale to Fill. Aún podría tener que capturar al delegado y mantener el contenido compensado, pero al menos debería evitar que el salto apunte (0,0). También la subvista Autoresizes debe estar desactivada. Estaba llegando a la parte superior de la vista de texto todo el tiempo sobre mí también y esto resolvió ese problema.


También puedes hacer:

textView.contentInset=UIEdgeInsetsZero;

en tu archivo delegado.


UITextView es una subclase de UIScrollView, por lo que tiene una propiedad configurable contentInset. Desafortunadamente, si intentas cambiar el contenido de una instancia de UITextView, el recuadro del borde inferior siempre se restablece a 32. Me he encontrado con esto antes con cuadros cortos de UITextView y he descubierto que esto es un problema. Sospecho que esto es lo que está causando su problema, pero debe verificar el contenido de su vista de texto en el depurador para estar seguro.

La solución / solución es simple: la subclase UITextView y reemplaza el método contentInset para que siempre devuelva UIEdgeInsetZero. Prueba esto:

// // BCTextView // // UITextView seems to automatically be resetting the contentInset // bottom margin to 32.0f, causing strange scroll behavior in our small // textView. Maybe there is a setting for this, but it seems like odd behavior. // override contentInset to always be zero. // @interface BCZeroEdgeTextView : UITextView @end @implementation BCZeroEdgeTextView - (UIEdgeInsets) contentInset { return UIEdgeInsetsZero; } @end


UITextView es una subclase de UIScrollView , por lo que la respuesta implica la propiedad contentOffset , que es lo que se cambia, no las inserciones o el tamaño del contenido. Si la posición de desplazamiento es correcta cuando la vista aparece por primera vez, puede almacenar el desplazamiento de contenido para recuperarlo más tarde.

YourViewController.h cortado

@interface YourViewController : UIViewController <UITextViewDelegate, UIScrollViewDelegate> @property(nonatomic, weak) IBOutlet UITextView *textView; @end

YourViewController.m snippet

@implementation YourViewController { @private BOOL _freezeScrolling; CGFloat _lastContentOffsetY; } // UITextViewDelegate - (void)textViewDidBeginEditing:(UITextView *)textView { // tell the view to hold the scrolling _freezeScrolling = YES; _lastContentOffsetY = self.textView.contentOffset.y; } // UITextViewDelegate - (void)textViewDidEndEditing:(UITextView *)textView { _freezeScrolling = NO; } // UIScrollViewDelegate - (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (_freezeScrolling) { // prevent the scroll view from actually scrolling when we don''t want it to [self repositionScrollView:scrollView newOffset:CGPointMake(scrollView.contentOffset.x, _lastContentOffsetY)]; } } // UIScrollViewDelegate - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { // scroll prevention should only be a given scroll event and turned back off afterward _freezeScrolling = NO; } // UIScrollViewDelegate - (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { // when the layout is redrawn, scrolling animates. this ensures that we are freeing the view to scroll _freezeScrolling = NO; } /** This method allows for changing of the content offset for a UIScrollView without triggering the scrollViewDidScroll: delegate method. */ - (void)repositionScrollView:(UIScrollView *)scrollView newOffset:(CGPoint)offset { CGRect scrollBounds = scrollView.bounds; scrollBounds.origin = offset; scrollView.bounds = scrollBounds; }

Lo que también es importante tener en cuenta en el ejemplo de código anterior es el último método. Llamar a cualquier clase de setContentOffset: hecho activará el desplazamiento, lo que resulta en una llamada a scrollViewDidScroll: Entonces, llamar a setContentOffset: produce un bucle infinito. Establecer los límites de desplazamiento es la solución para esto.

En pocas palabras, le decimos al controlador de vista que evite que la UITextView desplace cuando detectamos que el usuario ha seleccionado el texto para editar. También almacenamos el offset de contenido actual (ya que sabemos que el puesto es lo que queremos). Si el UITextView intenta desplazarse, mantenemos el desplazamiento del contenido en su lugar hasta que el desplazamiento se haya detenido (lo que desencadena ya sea scrollViewDidEndDecelerating: o scrollViewDidEndScrollingAnimation: . También descongelamos el desplazamiento cuando el usuario finaliza la edición.

Recuerde, este es un ejemplo básico, por lo que deberá modificar el código según el comportamiento exacto que desee.