Je sais qu'il existe des tonnes de code permettant de faire défiler une table vers le haut, mais je souhaite le faire lorsque la barre d'état supérieure est exploitée, comme dans les applications natives d'Apple. Est-ce possible?
Vous l'obtenez gratuitement, mais vous devez vérifier que l'attribut scrollsToTop
de votre UITableView
est OUI.
Lorsque cela ne fonctionne PAS, c’est lorsque vous avez un objet UIScrollView
(ou une classe descendante comme UITextView) incorporé dans une autre classe UIScrollView
(comme UITableView
). Dans ce cas, définissez scrollsToTop
sur la classe UIScrollView
incorporée sur NO. Ensuite, le comportement Tap-the-Status-Bar fonctionnera.
Si vous venez de Google et avez besoin d'une liste de contrôle complète:
En utilisant les informations données dans d'autres réponses, j'ai ajouté le code suivant à mon UITableViewController pour qu'il fonctionne:
- (void) viewDidLoad { [super viewDidLoad]; pour (UITextView * view in self.view.subviews) { if ([view isKindOfClass: [classe UITextView]]) { view.scrollsToTop = NO; } } self.tableView.scrollsToTop = YES; }
Cela examine toutes les vues de la hiérarchie UITableViewController et désactive scrollsToTop sur toutes les vues UITextViews qui interceptaient l'événement tactile. Ensuite, assuré que la tableView allait toujours recevoir le contact.
Vous pouvez modifier ceci pour itérer à travers d’autres UITableViews/UIScrollViews/UITextViews pouvant également intercepter.
J'espère que cela t'aides!
J'ai eu le même problème mais résolu en suivant les étapes suivantes:
Si votre contrôleur de vue/contrôleur de navigation est ajouté en tant que sous-vue sur un autre contrôleur de vue, veillez à le définir en tant que contrôleur enfant.
Je sais que c'est assez ancien, mais j'espère que cela pourra aider. Suite à ce que @MarkGranoff a dit, scrollsToTop ne fonctionne pas si plusieurs UIScrollView, ou ses sous-classes, l'ont défini sur YES (valeur par défaut), un contrôle de cohérence vaut probablement la peine de vérifier qui gâche réellement ce comportement. La méthode simple ci-dessous parcourt les sous-vues de votre vue et enregistre la valeur scrollsToTop de toutes les vues UIScrollView de votre vue. De préférence, être appelé dans votre méthode 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];
}
}
}
Ceci est juste un code de débogage en effet. Une fois que vous avez trouvé la valeur scrollsToTop pour chacune des sous-classes UIScrollView, assurez-vous qu’un seul est défini sur YES.
Comme Mark l'a dit, vous ne pouvez avoir qu'une seule sous-classe de UIScrollView (généralement la vue tabulaire) dont la propriété scrollsToTop est définie sur TRUE. Vous en avez probablement d'autres, généralement UITextView dans votre vue. Définissez simplement leur propriété scrollsToTop sur FALSE et vous êtes prêt à partir.
Sur le fichier d'en-tête UIScrollView:
// Lorsque l'utilisateur appuie sur la barre d'état, la vue de défilement située sous l'écran tactile le plus proche de la barre d'état défile vers le haut, mais uniquement si sa propriété
scrollsToTop
est YES, son délégué ne renvoie pas NO deshouldScrollViewScrollToTop
pas déjà au sommet . // Sur iPhone, nous n'exécutons ce geste que s'il existe une vue de défilement à l'écran avecscrollsToTop
== OUI. Si plus d'un est trouvé, aucun ne sera défilé.
Plusieurs descendants de UIScrollView peuvent être chargés, par exemple: avoir un contrôleur UIPageView sur chaque page contenant UITableViews.
La propriété scrollsToTop est par défaut true.
Ainsi, en plus de gérer la propriété scrollsToTop de UIScrollViews imbriquée, vous devez effectuer les opérations suivantes:
//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 cette façon, seul un scrollsToTop de haut niveau dans UITableView sera défini sur true.