UITableView à l'intérieur de UIScrollView ne reçoit pas de robinet d'abord après scrollling

Bref

Je rencontre un problème avec un UITableView à l'intérieur d'un UIScrollView. Quand je scroll externes scrollView, le table ne reçoit pas le willSelect/didSelect les cas, le premier contact, mais il ne le fait sur le second. Ce qui est encore plus étrange, la cellule elle-même est la touche et la mise en surbrillance de l'état, même lorsque le delegate ne pas.

Explication détaillée

Mon point de vue de la hiérarchie:

UIView
  - UIScrollView  (outerscroll)
      - Some other views and buttons
      - UITableView (tableView)

À l'intérieur de défilement de la vue, j'ai quelques vues supplémentaires que obtenir étendue/fermé de façon dynamique. La vue de la table doit obtenir "fixe" sur le dessus, avec quelques autres éléments de la vue, de sorte que c'est pourquoi j'ai créé cette disposition, qui me permet de déplacer facilement des éléments d'une manière similaire que Apple recommande par l'utilisation des transformations quand le livre arrive.

La Vue de la table est transformé avec un effet de conversion lors de la outerscroll se déplace comme ceci:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    if (scrollView == self.outerScrollView) {

        CGFloat tableOffset = scrollView.contentOffset.y - self.fixedHeaderFrame.origin.y;
        if (tableOffset > 0) {
            self.tableView.contentOffset = CGPointMake(0, tableOffset);
            self.tableView.transform = CGAffineTransformMakeTranslation(0, tableOffset);
        }
        else {
            self.tableView.contentOffset = CGPointMake(0, 0);
            self.tableView.transform = CGAffineTransformIdentity;
        }

        //Other similar transformations are done here, but not involving the table

}

Dans ma cellule, si j'en œuvre de ces méthodes:

- (void)setSelected:(BOOL)selected {
    [super setSelected:selected];
    if (selected) {
        NSLog(@"selected");
    }
}

- (void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated
{
    [super setHighlighted:highlighted animated:animated];
    if (highlighted) {
        NSLog(@"highlighted");
    }
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesBegan:touches withEvent:event];
    NSLog(@"touchesBegan");
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesEnded:touches withEvent:event];
    NSLog(@"touchesEnded");
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    [super touchesCancelled:touches withEvent:event];
    NSLog(@"touchesCancelled");
}

Y peut voir cette sortie lors de l'échec (appuyez d'abord sur):

2014-02-10 13:04:40.940 MyOrderApp[5588:70b] highlighted 
2014-02-10 13:04:40.940 MyOrderApp[5588:70b] touchesBegan 
2014-02-10 13:04:40.978 MyOrderApp[5588:70b] touchesEnded

Et celui-ci lorsque les œuvres (deuxième tap):

2014-02-10 13:05:30.359 MyOrderApp[5588:70b] highlighted 
2014-02-10 13:05:30.360 MyOrderApp[5588:70b] touchesBegan 
2014-02-10 13:05:30.487 MyOrderApp[5588:70b] touchesEnded 
2014-02-10 13:05:30.498 MyOrderApp[5588:70b] expanded

Aucun autre cadre de changement, animation ou tout autre point de vue, l'interaction se fait entre la première et la deuxième pression. Aussi, seulement lors du défilement de grandes quantités, le bug apparaît, mais avec des scrollings de quelques pixels tout continue à fonctionner comme prévu.

J'ai testé la modification de certaines propriétés, mais avec pas de chance. Certaines des choses que j'ai fait:

  • Supprimer userInteractionEnabled à partir de points de vue autres que le livre et le tableau
  • Ajouter un appel à setNeedsLayout sur la table, de défilement et de la vue principale lorsque scrollViewDidScroll se produit.
  • Supprimer les transformations de la table (encore)

J'ai vu certains commentaires sur le comportement inattendu de l'incorporation de UITableViews à l'intérieur de UIScrollViews mais je ne peux pas voir une telle avertir dans la documentation officielle par Apple, donc je m'attends à ce que cela fonctionne.

L'application est iOS7+ seulement.

Questions

Quelqu'un a connu des problèmes similaires? Pourquoi est-ce et comment puis-je le résoudre? Je pense que je pourrais être en mesure d'intercepter le robinet geste sur la cellule et de le passer avec un délégué personnalisé ou similaire, mais je voudrais la table pour recevoir la bonne événements et donc mon UITableViewDelegate le reçoit comme prévu.

Mises à jour

  • J'ai essayé de désactiver la cellule de la réutilisation comme suggéré dans un commentaire, mais il se produit toujours de la même manière.
  • avez-vous essayé [yourScroll bringSubviewToFront: yourTable]; ?
  • Vous mentionnez que cela se produit uniquement lorsque vous faites défiler beaucoup, ce qui m'amène à penser que les loisirs ou le recyclage des tableCells pourrait affecter cette? Pouvez-vous mettre un NSlog à l'intérieur de la cellForRowAtIndexPath: fonction et de voir si ce bug est déclenchée lorsque cela s'appelle?
  • merci mais j'ai déjà essayé. En outre, les cellules sont arriver au toucher (en cas d'échec et lorsque l'on travaille), et ils sont à l'intérieur de la table, de sorte que la position de la table ne semble pas être le problème.
  • C'était en fait une très bonne astuce, mais cela n'a pas fonctionné non plus. J'ai enlevé les cellules de la réutilisation de le tester et se produit toujours de la même façon. 🙁
  • Puis-je vous demander pourquoi êtes-vous à l'aide d'une tableview à l'INTÉRIEUR d'un scrollview? C'est comme avoir une scrollview sur un scrollview...
  • Hmm...interessant, pouvez-vous poster le code où vous le journal "élargi"? Est-il dans la de déléguer l'appel?
  • Oui, il est dans ma méthode du délégué. J'utilise une source de données générique qui gère le clic, c'est pourquoi je n'ai pas posté, mais la source de données fonctionne partout, tout autour de l'application, sauf qu'ici, il y a donc peu de chances que le problème est là.
  • il n'est pas si facile à expliquer en raison de la hiérarchie vue que j'ai besoin de construire, mais, fondamentalement, j'ai besoin de quelques têtes qui s'accrochent sur le dessus lors du défilement de l'extérieur de défilement de la vue, tandis que la table ont leur propre en-tête de vues fonctionne comme prévu et aussi empiler sur le dessus de l'en-tête de section est visible de défilement et le reste. Si j'utilise 1 table alors seulement je ne vais pas être en mesure de reproduire le même comportement
  • avez-vous des suplementaire touch geste modules de reconnaissance sur d'autres points de vue?
  • avez vous trouver une solution pour cela?
  • Avez-vous pensé à elle encore
  • Pas de. Ce que j'ai fait est un hack, l'ajout d'un robinet geste de reconnaissance à la table et cliquez sur juste la indexpath du point et appeler le délégué de tableView:willSelectRowAtIndexPath: et tableView:didSelectRowAtIndexPath: (s'il existe)