ios - Desplázate hasta la parte superior de UITableView tocando la barra de estado
objective-c scroll (9)
Sé que hay un montón de código para desplazar una vista de tabla hacia la parte superior, pero quiero hacerlo cuando se toca la barra de estado superior, al igual que en las aplicaciones nativas de Apple. es posible?
Como dijo Mark, solo puede tener una subclase de UIScrollView (generalmente la vista de tabla) que tiene la propiedad scrollsToTop establecida en TRUE. Es probable que tenga otros, generalmente UITextView en su opinión. Simplemente configure su propiedad scrollsToTop en FALSE y listo.
En el archivo de encabezado UIScrollView:
// Cuando el usuario toca la barra de estado, la vista de desplazamiento debajo del toque que está más cerca de la barra de estado se desplazará hacia arriba, pero solo si su propiedad
scrollsToTop
es SÍ, su delegado no devuelve NO deshouldScrollViewScrollToTop
, y es no ya en la cima. // En iPhone, ejecutamos este gesto solo si hay una vista de desplazamiento en pantalla conscrollsToTop
== YES. Si se encuentra más de uno, ninguno se desplazará.
Puede haber múltiples descendientes UIScrollView cargados, por ejemplo: tener un UIPageViewcontroller en cada página que contenga UITableViews.
La propiedad scrollsToTop es verdadera de forma predeterminada.
Por lo tanto, además de manejar la propiedad scrollsToTop anidada de UIScrollViews, debe hacer lo siguiente:
//When the view is loaded disable scrollsToTop, this view may not be the visible one
override func viewDidLoad() {
super.viewDidLoad()
...
tableView.scrollsToTop = false
}
//Now it''s time to enable scrolling, the view is guaranteed to be visible
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
tableView.scrollsToTop = true
}
//Do not forget to disable scrollsToTop, making other visible UIScrollView descendant be able to be scrolled to top
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.tableView.scrollsToTop = false
}
De esta forma solo scrollsToTop de UITableView de un nivel superior se establecerá en verdadero.
Sé que esto es bastante antiguo, pero espero que esto pueda ayudar. Siguiendo lo que dijo @MarkGranoff, ScrollsToTop no funciona si más de un UIScrollView, o sus subclases, lo tienen establecido en SÍ (valor predeterminado), una comprobación de cordura probablemente valga la pena comprobar quién se está equivocando con este comportamiento. El método simple que se muestra a continuación recorre las subvistas de su vista y registra el valor de scrollsToTop de todo el UIScrollView en su vista. Preferiblemente ser llamado en su método viewDidAppear.
- (void)checkForScrollViewInView:(UIView *)view {
for (UIView *subview in [view subviews]) {
if ([subview isKindOfClass:[UIScrollView class]]) {
NSLog(@"scrollsToTop enabled: %i in scroll view %@", ((UIScrollView *)subview).scrollsToTop, subview);
}
if (subview.subviews.count > 0) {
[self checkForScrollViewInView:subview];
}
}
}
Esto es solo un código de depuración de hecho. Una vez que encuentre el valor de scrollsToTop para cada una de las subclases UIScrollView, asegúrese de que solo una esté establecida en SÍ.
Si proviene de Google y necesita una lista de verificación completa:
- Verifique que haya configurado scrollsToTop = YES (según la sugerencia de Mark) en su UITableView
- Asegúrese de haber configurado scrollsToTop = NO en todos los OTHER UITableViews / UIScrollViews / UITextViews en su ventana, para que no estén interceptando el clic. Me he encontrado imprimiendo todas las vistas en mi ventana muchas veces para depurar esto ...
- Asegúrese de que su vista de tabla esté en 0/0 (coordenadas x / y) dentro de la ventana; así es como el sistema sabe que debe pasar el mensaje
Tuve el mismo problema, pero se solucionó con los siguientes pasos:
- Establezca scrollsToTop = YES para la vista de tabla que desea desplazarse hacia arriba.
- set scrollsToTop = NO para todas las otras vistas de tabla o colección o scrollview.
- Si alguna de su celda de vista de tabla tiene vista de colección. Asegúrese de configurar scrollsToTop en NO para la vista de colección también.
Si su controlador de vista / controlador de navegación se agrega como una subvista en otro controlador de vista, asegúrese de configurarlo como un Controlador hijo.
Utilizando la información proporcionada en otras respuestas, agregué el siguiente código a mi UITableViewController para que funcione:
- (void)viewDidLoad { [super viewDidLoad]; for (UITextView *view in self.view.subviews) { if ([view isKindOfClass:[UITextView class]]) { view.scrollsToTop = NO; } } self.tableView.scrollsToTop = YES; }
Esto se ve a través de todas las vistas en la jerarquía de UITableViewController y apaga scrollsToTop en todas las UITextViews que interceptaban el evento táctil. Luego, se aseguró de que tableView aún recibiera el toque.
Puede modificar esto para iterar a través de otras UITableViews / UIScrollViews / UITextViews que también puedan estar interceptando.
¡Espero que esto ayude!
UITableView
esto gratis, pero debes verificar que el atributo UITableView
de tu UITableView
sea SÍ.
Cuando esto NO funciona es cuando tiene un objeto UIScrollView
(o clase descendiente como UITextView) incrustado dentro de otra clase UIScrollView
(como UITableView
). En este caso, establezca scrollsToTop
en la clase UIScrollView
incrustada en NO. Entonces, el comportamiento de tap-the-status-bar funcionará.