J'essaie de limiter la zone de balayage de l'Uiscrollview, mais je ne peux pas le faire.
Je voudrais définir la zone de balayage uniquement au sommet de l'Uiscrollview, mais je voudrais mettre tout le monde Contenu visible. p>
mise à jour: p> solution:
N'oubliez pas de définir DelayScontentTouches à NO sur l'UISCrollView P> self.categoryScrollView.delaysContentTouches = NO;
3 Réponses :
Vous pouvez désactiver le défilement sur le uiscrollview code>, remplacer
touchesbegan: windevent: code> dans votre contrôleur d'affichage, vérifiez si l'une des touches a commencé dans la zone où vous souhaitez Pour activer les balayages et si la réponse est «Oui», réactivez le défilement. Aussi remplaçable
touché: Sans: code> et
touchesCancéd: WithEvent: code> Pour désactiver le défilement lorsque les touches sont terminées. P>
Bonjour, quelque chose s'est mal passé. Le balayage uniquement est activé après la fin du toucher, pas pendant la phase de touche actuelle :(
@ Viskymáté Je n'étais pas certain que cela fonctionnerait, mais je pense que cela valait un coup de feu. Une autre chose à essayer de garder le défilement activé, désactivez-la dans le touches à touches: SortEvent: code> S'ils sont en dehors de la zone et réactivent le défilement dans le
touché code> /
touchscancéd code>.
Il est commencé à travailler, mais :( ça ne fonctionne pas tout le temps. Il y a un délai bref avant la touche touchbegine / annulée / déplacée, c'est pourquoi si je pince vite, cela ne fonctionne pas, tout autre temps il est travailler. Si vous pouvez m'aider à tourner de ce délai (je ne sais pas où est-ce) ce serait génial et solution réussie
@ ViskymáTé Eh bien, c'est une amélioration, je suppose. Malheureusement, vous ne pouvez pas désactiver le délai de reconnaissance, mais vous pouvez faire une autre chose: garder une trace de tous les événements tactiles en cours et désactiver le défilement lorsque l'une des touches commence à l'extérieur de la zone désignée. De plus, je pense qu'il est correct de ne pas transmettre touchesbegan / touché / etc. dans votre catégorieCrollView. Je sais que la personnalisation du rouleau peut devenir délicate, mais je pense que vous allez dans la bonne direction: j'ai utilisé une stratégie similaire pour mettre en œuvre des objets dans une vue de défilement.
Self.CatégoriesCrollview.delayscontentTouches = non;
@ Viskymáté c'est une excellente trouvaille! Je l'utiliserai dans mon propre code pour voir si mon éditeur sera plus réactif. Merci!
@dasblinkenlight Je sais que c'est un vieux fil mais c'est la deuxième fois que vous m'aidez brillamment. Bravo pour vous.
Cette Blog Post présente une manière très simple et propre de mettre en œuvre la fonctionnalité.
// init or viewDidLoad UIScrollView *scrollView = (UIScrollView *)view; _scrollViewPanGestureRecognzier = [[UIPanGestureRecognizer alloc] init]; _scrollViewPanGestureRecognzier.delegate = self; [scrollView addGestureRecognizer:_scrollViewPanGestureRecognzier]; // - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)otherGestureRecognizer { return NO; } - (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer == _scrollViewPanGestureRecognzier) { CGPoint locationInView = [gestureRecognizer locationInView:self.view]; if (locationInView.y > SOME_VALUE) { return YES; } return NO; } return NO; }
Autres réponses n'a pas fonctionné pour moi. Sous-classement UISCrollView code> a fonctionné pour moi (SWIFT 3):
class ScrollViewWithLimitedPan : UIScrollView {
// MARK: - UIPanGestureRecognizer Delegate Method Override -
override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
let locationInView = gestureRecognizer.location(in: self)
print("where are we \(locationInView.y)")
return locationInView.y > 400
}
}
Je pense que c'est la voie «la plus propre» d'aller.
Manière lisse c'est.
Joli! 2 ans plus tard, vous m'avez aidé: P