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.