web-dev-qa-db-fra.com

Faites défiler le haut de UITableView en appuyant sur la barre d'état

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?

57
Chase

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.

148
Mark Granoff

Si vous venez de Google et avez besoin d'une liste de contrôle complète:

  1. Vérifiez que vous avez défini scrollsToTop = YES (selon la suggestion de Mark) sur votre UITableView
  2. Assurez-vous que vous avez défini scrollsToTop = NO sur tous les AUTRES UITableViews/UIScrollViews/UITextViews de votre fenêtre, de sorte qu'ils n'interceptent pas le clic. Je me suis retrouvé à imprimer plusieurs fois toutes les vues dans ma fenêtre pour déboguer cette ...
  3. Assurez-vous que la vue de votre table est à 0/0 (coordonnées x/y) dans la fenêtre - le système sait ainsi qu'il doit transmettre le message.
31
Zane Claes

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!

6
Brandon Roberts

J'ai eu le même problème mais résolu en suivant les étapes suivantes:

  1. Définissez scrollsToTop = YES pour la vue de table que vous souhaitez faire défiler vers le haut.
  2. set scrollsToTop = NO pour toutes les autres vues de table ou de collection ou de défilement.
  3. Si l'une des cellules de votre table a une vue de collection. Assurez-vous également que vous définissez scrollsToTop sur NO pour la vue Collection.

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.

6
iOS Developer

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.

2
DennyLou

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.

2
George

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 de shouldScrollViewScrollToTop pas déjà au sommet . // Sur iPhone, nous n'exécutons ce geste que s'il existe une vue de défilement à l'écran avec scrollsToTop == OUI. Si plus d'un est trouvé, aucun ne sera défilé.

1
foskon

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.

0
Géza Mikló

Par exemple, si vous avez une vue de table et une vue de défilement comme des balises comme celle-ci

 enter image description here

vous devriez faire quelque chose comme ceci dans viewDidLoad

self.tableView.scrollsToTop = true
self.tagsView.scrollsToTop = false
0
Abo3atef