9
votes

Uiscrollview LIMITER SWIPE ZONE

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> xxx pré>

solution: N'oubliez pas de définir DelayScontentTouches à NO sur l'UISCrollView P>

self.categoryScrollView.delaysContentTouches = NO;


1 commentaires

Joli! 2 ans plus tard, vous m'avez aidé: P


3 Réponses :


7
votes

Vous pouvez désactiver le défilement sur le uiscrollview , remplacer touchesbegan: windevent: 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: et touchesCancéd: WithEvent: Pour désactiver le défilement lorsque les touches sont terminées.


7 commentaires

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: S'ils sont en dehors de la zone et réactivent le défilement dans le touché / touchscancéd .


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.



4
votes

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;
}


0 commentaires

7
votes

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
    }
}


2 commentaires

Je pense que c'est la voie «la plus propre» d'aller.


Manière lisse c'est.