web-dev-qa-db-fra.com

Désactivation du défilement horizontal depuis UIScrollView Swift

Vue de défilement

J'ai un UIScrollView, avec des contraintes left: 0, top: 0, right: 0, bottom: 0

Vue de défilement intérieure

En haut de cette UIScrollView est un UIImageView avec des contraintes left: 0, top: 0, right: 0, height: 200

En dessous, j'ai un UITextView avec des contraintes left: 0, top: 0, right: 0, bottom: 0

Cela signifie que le UITextView sera redimensionné par rapport à son contenu, et j'ai défini le scrollingEnabled sur false pour le UITextView.

Donc, quand je cours, cela presque fonctionne parfaitement.

Le seul problème est que UIImageView occupe environ 10% de plus que la largeur réelle de l'écran. Par conséquent, le défilement horizontal est activé.

J'ai essayé d'ajouter les lignes

imageView.frame = CGRect(0, 0, screenSize.width, 200)
scrlView.contentSize.width = screenSize.width

mais cela ne fait aucune différence. Je peux toujours faire défiler horizontalement et la vue d'image occupe toujours environ 10% de plus que la largeur réelle de l'écran.

Remarque, je n'ai pas défini la largeur de l'écran imageView dans le storyboard, uniquement par programme.

Des idées?

20
Greg Peckory

Comme ça,

func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView.contentOffset.x>0 {
        scrollView.contentOffset.x = 0
    }
}

Et, vous pouvez définir cette propriété:

scrollImg.directionalLockEnabled = true
17
Loxx

J'ai changé cela pour qu'il renvoie juste 0. Pas besoin de vérifier du tout si vous voulez faire défiler.

func scrollViewDidScroll(scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0
}

Pas besoin de verrouillage directionnel.

22
the_dude_abides

Swift 4

Verrouillage du défilement horizontal

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if scrollView.contentOffset.x != 0 {
        scrollView.contentOffset.x = 0
    }
}

Vous pouvez changer le x en y pour le défilement vertical.

Assurez-vous d'ajouter UIScrollViewDelegate comme ceci:

class MyViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet var scrollView: UIScrollView!

    ...
}

Et définissez le délégué pour ScrollView

scrollView.delegate = self
17
HunterCopp
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    scrollView.contentOffset.x = 0
}

Cela empêche également la vue de défilement de défiler vers le bord d'attaque.

3
Steven Lee

Si vous utilisez le storyboard et la mise en page automatique, vous devez considérer le fonctionnement de ScrollView dans Storyboard avec la mise en page automatique.

Considérer ce qui suit.

  1. Ajoutez une vue unique sur votre scrollView avec les contraintes gauche, droite, haut, bas, hauteur, largeur,

  2. Faire la sortie de la largeur et de la hauteur

  3. Ajoutez vos sous-vues à la vue que vous avez ajoutée dans le scrollView

mettre à jour la largeur de l'écran par exemple: 320 pour iPhone5 ou 4.

self.viewWidth = SCREEN_WIDTH;
[self.view updateConstraints];
1
Rohit Kumar