Recherche…


Créer un UIScrollView

Créez une instance de UIScrollView avec un CGRect tant CGRect .

Rapide

let scrollview = UIScrollView.init(frame: CGRect(x: 0, y: 0, width: 320, height: 400))

Objectif c

UIScrollView *scrollview = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 320, 400)];

Défilement Afficher la taille du contenu

La propriété contentSize doit être définie sur la taille du contenu défilant. Ceci spécifie la taille de la zone déroulante. Le défilement est visible lorsque la zone défilante, c.-à-d. contentSize est plus grande que la taille de l'image UIScrollView .

Avec Autolayout:

Lorsque le contenu de la vue de défilement est configuré avec autolayout, il doit être explicitement dimensionné verticalement et horizontalement et les 4 arêtes doivent être épinglées à la vue de défilement contenant. De cette façon, contentSize est calculé automatiquement en fonction du contenu de la vue de défilement et est également mis à jour lorsque la disposition du contenu est modifiée.

Manuellement:

Rapide

scrollview.contentSize = CGSize(width: 640, height: 800)

Objectif c

scrollview.contentSize = CGSizeMake(640, 800);

ScrollView avec mise en forme automatique

Étapes simples pour utiliser scrollview avec autolayout.

  • Créer un nouveau projet avec une application à vue unique
  • Sélectionnez le viewcontroller par défaut et changez sa taille d'écran en iPhone-4inch à partir de l'inspecteur d'attributs.
  • Ajoutez une vue de défilement à la vue de votre viewcontroller comme suit et définissez la couleur d'arrière-plan sur bleu

entrer la description de l'image ici

  • Ajoutez des contraintes comme indiqué ci-dessous image

entrer la description de l'image ici

Qu'est-ce que cela va faire, il suffit de coller tous les bords de scrollview à la vue de viewcontroller

Scénario 1:

Maintenant, disons que notre contenu est énorme, et nous voulons qu'il défile horizontalement aussi bien que verticalement.

Pour ça,

  • Ajoutez un UIView à la vue de défilement du cadre (0,0,700,700). Donnez-lui une couleur de fond orange pour l'identifier différemment.

entrer la description de l'image ici

Vient ensuite la partie importante, il faut la faire défiler horizontalement et verticalement.

  • Sélectionnez la vue orange et ajoutez les contraintes suivantes

    entrer la description de l'image ici

Laissez-moi vous expliquer ce que nous avons fait dans l'étape ci-dessus.

  • Nous avons fixé la hauteur et la largeur à 700.
  • Nous définissons un espace à scrollview = 0 qui indique à la vue de défilement que le contenu est défilable horizontalement.
  • Nous définissons l'espace du bas sur scrollview = 0 qui indique à la vue de défilement que le contenu est défilable verticalement.

Maintenant, lancez le projet et vérifiez.

Scénario 2: considérons un scénario où nous savons que la largeur du contenu sera identique à la largeur de défilement, mais que la hauteur est supérieure à celle de scrollview.

Suivez les étapes pour faire défiler le contenu verticalement.

  • Supprimez la contrainte de largeur dans le cas ci-dessus.
  • Modifiez la largeur de la vue orange pour qu'elle corresponde à la largeur de la vue de défilement.
  • Faites glisser Ctrl depuis la vue orange pour faire défiler la vue et ajouter une contrainte de largeur égale .

entrer la description de l'image ici

  • Et fait!!! Il suffit de lancer et de vérifier s'il défile verticalement

Scénario 3:

Maintenant, nous voulons faire défiler uniquement horizontalement et non verticalement.

Suivez les étapes pour faire défiler horizontalement le contenu.

  • Annuler toutes les modifications pour obtenir des contraintes comme ci-dessous (c.-à-d. Restaurer les contraintes d'origine qui ont atteint le défilement vertical et horizontal )

entrer la description de l'image ici

  • Vérifiez l'image de la vue orange, qui devrait être (0,0,700,700)
  • Supprimer la contrainte de hauteur de la vue orange.
  • Modifiez la hauteur de la vue orange pour qu'elle corresponde à la hauteur de défilement.
  • Tout en maintenant la touche Ctrl enfoncée, faites glisser la vue orange pour faire défiler la vue et ajouter une contrainte de hauteur égale .

entrer la description de l'image ici

  • Et fait!!! Il suffit de lancer et de vérifier s'il défile verticalement

Défilement du contenu avec mise en forme automatique activée

Ce projet est un exemple autonome entièrement réalisé dans Interface Builder. Vous devriez pouvoir le parcourir en 10 minutes ou moins. Ensuite, vous pouvez appliquer les concepts que vous avez appris à votre propre projet.

gif animé montrant le défilement horizontal

Ici, j'utilise juste UIView s mais ils peuvent représenter n'importe quelle vue que vous aimez (c.-à-d. Bouton, étiquette, etc.). J'ai également choisi le défilement horizontal car les captures d'écran du storyboard sont plus compactes pour ce format. Les principes sont les mêmes pour le défilement vertical.

Concepts clés

  • UIScrollView ne doit utiliser qu'une seule sous-vue. Ceci est un 'UIView' qui sert de vue de contenu pour contenir tout ce que vous souhaitez faire défiler.
  • Rendre la vue du contenu et le parent de la vue de défilement avoir des hauteurs égales pour le défilement horizontal. (Largeurs égales pour le défilement vertical)
  • Assurez-vous que tout le contenu défilable a une largeur définie et est épinglé de tous les côtés.

Lancer un nouveau projet

Il ne peut s'agir que d'une application à vue unique.

Storyboard

Dans cet exemple, nous allons faire un défilement horizontal. Sélectionnez le View Controller, puis choisissez Freeform dans l'inspecteur de taille. Faites la largeur 1,000 et la hauteur 300 . Cela nous donne juste la place dans le storyboard pour ajouter du contenu qui défile.

capture d'écran des paramètres de taille simulés

Ajouter une vue de défilement

Ajoutez un UIScrollView et épinglez les quatre côtés à la vue racine du contrôleur de vue.

screenshot de défilement épinglé

Ajouter une vue de contenu

Ajoutez un UIView tant que sous-vue à la vue de défilement. Ceci est la clé. N'essayez pas d'ajouter beaucoup de sous-vues à la vue de défilement. Ajoutez simplement un seul UIView . Ce sera votre affichage de contenu pour les autres vues que vous souhaitez faire défiler. Épinglez la vue de contenu à la vue de défilement sur les quatre côtés.

contenu épinglé vue capture d'écran

Hauteurs égales

Désormais, dans la structure du document, la commande clique à la fois sur la vue du contenu et sur la vue parente de la vue de défilement afin de les sélectionner toutes les deux. Ensuite, définissez les hauteurs comme étant égales (contrôlez </ kbd faites glisser de l’affichage de contenu vers l’affichage de défilement>). C'est aussi la clé. Comme nous faisons défiler horizontalement, la vue du contenu de la vue de défilement ne saura pas à quelle hauteur elle doit être, sauf si nous la configurons de cette manière.

réglage de la hauteur égale screenshot

Remarque:

  • Si nous faisions défiler le contenu verticalement, nous définirions la largeur de la vue de contenu comme étant égale à la largeur du parent de la vue de défilement.

Ajouter du contenu

Ajoutez trois UIView s et donnez-leur toutes les contraintes. J'ai utilisé 8 marges de points pour tout.

Capture d'écran IB avec affichage du contenu ajouté

Contraintes:

  • Vue verte: épinglez les bords supérieur, gauche et inférieur. Faites la largeur 400.
  • Vue rouge: épinglez les bords supérieur, gauche et inférieur. Faites la largeur 300.
  • Vue violette: épinglez les quatre bords. Faites la largeur quel que soit l'espace restant (268 dans ce cas).

La définition des contraintes de largeur est également la clé pour que la vue de défilement connaisse la largeur de son affichage de contenu.

Fini

C'est tout. Vous pouvez exécuter votre projet maintenant. Il devrait se comporter comme l'image défilante en haut de cette réponse.

Une étude plus approfondie

Activer / Désactiver le défilement

La propriété scrollEnabled stocke une valeur Boolean qui détermine si le défilement est activé ou non.
Si la valeur de cette propriété est true / YES, le défilement est activé, sinon pas.La valeur par défaut est true

Rapide

scrollview.isScrollEnabled = true

Objectif c

scrollview.scrollEnabled = YES;

Zoom avant / arrière UIImageView

Créer une instance UIScrollView

let scrollview = UIScrollView.init(frame: self.view.bounds)

Et puis définissez ces propriétés:

scrollView.minimumZoomScale = 0.1
scrollView.maximumZoomScale = 4.0
scrollView.zoomScale = 1.0
scrollview.delegate = self as? UIScrollViewDelegate 

Pour effectuer un zoom avant ou arrière sur l'image, vous devez spécifier la quantité de zoom avant et arrière que l'utilisateur peut utiliser. Nous faisons cela en définissant les valeurs des propriétés minimumZoomScale et maximumZoomScale de la vue de minimumZoomScale . Les deux sont définis sur 1.0 par défaut.

Et zoomScale à 1.0 qui spécifie le facteur de zoom pour le zoom minimum et maximum.

Pour prendre en charge le zoom, vous devez définir un délégué pour votre vue défilement. L'objet délégué doit être conforme au protocole UIScrollViewDelegate . Cette classe de délégué doit implémenter la méthode viewForZoomingInScrollView() et renvoyer la vue pour zoomer.

Modifiez votre ViewController comme indiqué

class ViewController: UIViewController, UIScrollViewDelegate

Ajoutez ensuite la fonction de délégué suivante à la classe.

func viewForZoomingInScrollView(scrollView: UIScrollView) -> UIView? {
    return imageView
}

Maintenant, créez une instance UIImageView

Faire de cette variable une variable de classe

var imageView:UIImageView = UIImageView.init(image: UIImage.init(named: "someImage.jpg"))

Et puis l'ajouter à scrollview

scrollView?.addSubview(imageView)

Référence

Détection du moment où UIScrollView a fini de défiler avec les méthodes déléguées

scrollViewDidEndDecelerating: indique au délégué que la vue de défilement a cessé de ralentir le mouvement de défilement.

Objectif c:

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    [self stoppedScrolling];
}

- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (!decelerate) {
        [self stoppedScrolling];
    }
}

- (void)stoppedScrolling {
    // done, do whatever
}

Rapide:

func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
    if !decelerate {
        stoppedScrolling()
    }
}

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    stoppedScrolling()
}

func stoppedScrolling() {
    // done, do whatever
}

Restreindre le sens du défilement

Vous pouvez restreindre les instructions que l'utilisateur peut faire défiler à l'aide du code suivant:

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

Chaque fois que l'utilisateur fait défiler l'axe des x, le décalage du contenu de scrollView est remis à 0.
Vous pouvez évidemment changer les x s en y s et verrouiller ainsi la direction pour être horizontale uniquement.

Vous devez également vous assurer de placer ce code dans la méthode déléguée scrollViewDidScroll(_ scrollView: UIScrollView) . Sinon, vous ne pourrez pas le faire fonctionner.

Veillez également à avoir importé UIScrollViewDelegate dans votre déclaration de classe, comme ceci:

class ViewController: UIViewController, UIScrollViewDelegate

... et définissez le délégué de scrollView sur une méthode comme viewDidLoad(_:)

scrollView.delegate = self


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow