2012-06-12 4 views
19

J'ai un UIScrollView et je veux qu'il soit capable de défiler dans les deux directions (c'est le cas actuellement) mais seulement un à la fois. Ainsi, par exemple, si vous commencez à le faire défiler horizontalement, il ne bougera pas verticalement du tout jusqu'à ce que vous le lâchiez et que vous commenciez à le déplacer verticalement. Comment pourrais-je faire cela?UIScrollView défilement dans une seule direction à la fois

Répondre

51

Définissez la propriété directionalLockEnabled sur YES. À partir des documents Apple:

Si cette propriété est NON, le défilement est autorisé dans les directions horizontale et verticale. Si cette propriété est OUI et que l'utilisateur commence à faire glisser dans une direction générale (horizontalement ou verticalement), la vue déroulante désactive le défilement dans l'autre sens. Si la direction de déplacement est en diagonale, le défilement ne sera pas verrouillé et l'utilisateur pourra faire glisser dans n'importe quelle direction jusqu'à ce que la glissade soit terminée. La valeur par défaut est NO

+2

Huh, je mets cette propriété dans IB mais il ne fonctionnait pas. Cela n'a fonctionné que par programme. Merci! – Letrstotheprez

+0

J'ai ajouté ceci à: - (void) scrollViewDidEndDecelerating: (UIScrollView *) scrollView a travaillé pour moi. Et ajouté: scrollView.directionalLockEnabled dans la fonction. Quand j'ai lu cette réponse, il m'a fallu un peu de temps pour réaliser à quoi j'ajoutais la directionLockEnabled et où je l'ajoutais –

4

La réponse acceptée pour cette question n'est pas entièrement correcte. Selon la documentation actuelle pour directionalLockEnabled (tel que cité dans la réponse originale):

Si la direction de glissement est diagonale, puis le défilement ne sera pas verrouillé et l'utilisateur peut glisser dans toutes les directions jusqu'à ce que le déplacement se termine.

J'ai trouvé que c'était le cas moi-même. Si la direction initiale du glissement est plus proche d'un angle de 45 degrés entre les axes x et y, le verrouillage directionnel échoue. Si vous faites glisser plus ou moins horizontalement ou verticalement, le verrouillage s'active.

Pour un chemin d'y véritable verrouillage uniaxiale, voir ce lien: http://bogdanconstantinescu.com/blog/proper-direction-lock-for-uiscrollview.html

2

la manière simple d'y parvenir est de définir la directionalLockEnabled-YES et mettre en œuvre le délégué UIScrollerView comme celui-ci

- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 
    if (scrollView.contentOffset.x != 0 && 
     scrollView.contentOffset.y != 0) { 
     scrollView.contentOffset = CGPointMake(0, 0); 
    } 
} 
+0

Très simple et fonctionne très bien. Je vous remercie. –

0

Cela a fonctionné pour moi basé sur @Joe xi réponse. Swift 3,0

func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if scrollView.contentOffset.x != 0 && scrollView.contentOffset.y != 0 { 
     scrollView.contentOffset = CGPoint(x: 0, y: 0) 
    } 
} 
Questions connexes