when objective appears ios uitableview uiscrollview uitextfield

ios - objective - Deshabilitar el desplazamiento automático de UITableView al editar UITextField dentro de UITableViewCell



move view up when keyboard appears objective c (8)

¿Intentó establecer "scrollsToTop" - la propiedad de tableview en NO. Por defecto es SÍ.

Estoy utilizando UITableViewCell personalizado dentro de mi UITableView . Cada uno de estos UITableViewCell es bastante alto y contiene un UITextField en la parte superior.

Cuando un usuario toca el UITextField para editarlo, aparece un teclado y el UITableView desplaza automáticamente para que la celda esté en la parte superior de la pantalla.

El problema es que esto desplaza el UITableView a la parte inferior de UITableViewCell , no a la parte superior. Cuando UITableViewCell es alto y está editado, UITextField está en la parte superior, por lo que no puede ver el UITextField . Sé cómo desplazar el programa UITableView programación, pero simplemente no sé cómo desactivar este desplazamiento automático para que pueda desplazar el UITableView por mi cuenta. ¿Cómo puedo hacer esto?


Definir propiedades para su UITableViewController :

@property (nonatomic) BOOL scrollDisabled; @property (nonatomic) CGFloat lastContentOffsetY;

Antes de llamar a becomeFirstResponder :

// Save the table view''s y content offset lastContentOffsetY = tableViewController.tableView.contentOffset.y; // Enable scrollDisabled scrollDisabled = YES;

Agregue el siguiente código a su controlador de vista de tabla:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView { if (self.scrollDisabled) { [self.tableView setContentOffset:CGPointMake(0, lastContentOffsetY)]; } ... }

Después de llamar a resignFirstResponder , configure scrollDisabled = NO .


El comportamiento UITableViewController se encuentra en la funcionalidad UITableViewController .

Para desactivar el desplazamiento automático encontré dos formas:

  1. Utilice en lugar de UITableViewController simplemente un UIViewController : establezca el origen de datos y delegue por su cuenta.
  2. Reemplace el método viewWillAppear y no llame a [super viewWillAppear: animated]

Con ambas soluciones, usted desactiva no solo el Desplazamiento automático, sino también algunas otras características bonitas pero no esenciales, que se describen en la descripción general de la referencia de clase de Apple:

https://developer.apple.com/documentation/uikit/uitableviewcontroller


El problema para mí no fue tanto que se desplazara, sino que quitó la vista de texto que se estaba editando fuera de la pantalla.

Entonces, en lugar de evitar que se desplace, simplemente vuelvo a desplazar la tabla hacia donde quiero cuando se inicia la edición, así:

public func textViewShouldBeginEditing(textView: UITextView) -> Bool { dispatch_async(dispatch_get_main_queue()) { tableViewController.tableView.scrollToRowAtIndexPath(self.indexPath!, atScrollPosition: UITableViewScrollPosition.Middle, animated: true) } return true }


La mejor manera es subclasificar UITableView y luego anular setContentOffset(_ contentOffset: CGPoint, animated: Bool) y no llamar a super.setContentOffset(_ contentOffset: CGPoint, animated: Bool) . En este método es donde el controlador de vista está haciendo el desplazamiento automático.

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool) { //Do nothing }


Lamentablemente, anulando -viewWillAppear: no funciona para mí en iOS 8.

Aquí está mi solución (como en la implementación de UITableViewController):

- (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] removeObserver:self.tableView name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self.tableView name:UIKeyboardWillHideNotification object:nil]; }

Dado que el comportamiento de desplazamiento automático es invocado por las notificaciones show / hide de UIKeyboard, simplemente NO las observe.


Puedes hacer lo siguiente:

- (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; } - (void)unregisterForKeyboardNotifications { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil]; } - (void)keyboardWillShow:(NSNotification *)notification { self.tableView.scrollEnabled = NO; } - (void)keyboardDidShow:(NSNotification *)notification { double delayInSeconds = 0.3; dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC)); dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ self.tableView.scrollEnabled = YES; }); }

Luego implementa este método UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { if (! self.tableView.scrollEnabled) [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO]; }

!!! Pero ten en cuenta que si el usuario toca una ubicación en el UITextField que cubrirá el teclado, no se desplazará.

Desde mi punto de vista, lo mejor que puede hacer es asegurarse de que todas las celdas de arriba a abajo con el UITextField incluido, serán visibles cuando se muestre el Teclado.


Puedes intentar hacer lo siguiente:

self.tableView.scrollEnabled = NO;

Esto debería deshabilitar la vista de desplazamiento en la vista de tabla.