2010-08-18 6 views
34

J'ai une vue défilée qui défilait lorsque les boutons n'étaient pas partout. Maintenant, il le fait, et lorsque vous faites glisser la souris (sur le simulateur) rien ne se passe (je pense que parce que les boutons sont poussés). Comment puis-je faire ça correctement?ScrollView ne défile pas lorsque vous faites glisser les boutons

+1

Avez-vous essayé sur un périphérique physique, il existe plusieurs différences entre les appareils et le simulateur, et la souris et multi-touch est l'un des plus grands! –

Répondre

92

Cela se produit parce que UIButton sous-vues du UIScrollView (je suppose que les boutons sont ajoutés comme des sous-vues dans votre cas) sont le suivi des touches et non la vue de défilement. UIScrollView la méthode touchesShouldCancelInContentView est la clé ici. Selon sa description: "La valeur retournée par défaut est OUI si la vue n'est pas un objet UIControl, sinon, elle renvoie NO.", C'est-à-dire UIControl objets (boutons), UIScrollView n'essaie pas d'annuler les touches qui empêchent le défilement.

Ainsi, pour permettre le défilement avec des boutons:

  1. Assurez-vous que la propriété UIScrollViewcanCancelContentTouches est réglé sur YES.
  2. Sous UIScrollView et passer outre touchesShouldCancelInContentView pour revenir YES quand l'objet de vue du contenu est un UIButton, comme ceci:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view 
{ 
    if ([view isKindOfClass:[UIButton class]]) { 
     return YES; 
    } 

    return [super touchesShouldCancelInContentView:view]; 
} 
+0

merci pour votre réponse. J'ai changé le défilement ayant des images pour simuler des boutons (et des touches de suivi pour savoir quand appeler une méthode). Je vais essayer votre solution et voir comment cela fonctionne. Merci! – DanielaM

+4

@DanielaM Si cette réponse merveilleuse vous a aidé comme elle le semble vraiment, il serait bon de l'accepter. – iHunter

+0

** gras ** @Roman K - Vous êtes mon héros! J'ai passé 2 jours à lire dans beaucoup de messages \ forums sur ce problème qui se chevauchent mais aucun tweak ou solution n'a vraiment fonctionné. Votre solution fonctionne vraiment !! Salutations :-) – Shvalb

9

Je fonde cette question à la recherche de la solution rapide à ce problème, je « traduit » comme ceci:

class UIButtonScrollView: UIScrollView { 

    override func touchesShouldCancelInContentView(view: UIView!) -> Bool { 
     if (view.isKindOfClass(UIButton)) { 
      return true 
     } 

     return super.touchesShouldCancelInContentView(view) 

    } 

} 

espère que cela pourrait aider

4

Swift 3 Solution

override func touchesShouldCancel(in view: UIView) -> Bool { 
    if view is UIButton { 
     return true 
    } 
    return super.touchesShouldCancel(in: view) 
} 
Questions connexes