Faire défiler un grand nombre d'images

Bonjour, 


 


J'aimerais pouvoir créer une boucle avec une scene qui me permette de faire défiler beaucoup d'images à  la suite environ 40, et pouvoir revenir sur l'image précédente en utilisant deux boutons. Un peu comme sur un ordinateur et que vous souhaiteriez montrer à  vos amis les photos de vos vacances stockés sur le disque de votre ordinateur. 


 


Quelle serait dans ce cas la solution la plus simple selon vous  ? 


 


Merci pour vos réponses.


«13

Réponses

  • Pourrais-tu tu présenter dans le forum adéquat ? Nous y parler un peu de ton niveau, cela nous permettrait alors de mieux répondre à  tes questions, avec des termes plus ou moins techniques, expliquer des concepts ou non, faire des analogies avec d'autres languages, etc.


     


    Sinon, veux-tu des animations entre la précédente, la courante et la photo suivante ?


    Ou juste une image au milieu et deux boutons prev/next et ça remplace directement l'image ? 


  • Bonjour merci pour votre réponse. 


     


    Je n'ai pratiquement aucune connaissance de la programmation ce serait et donc allé au plus simple ça serait deux boutons Prev/Next et ca remplace l'image précédente. 

  • DrakenDraken Membre
    avril 2017 modifié #4

    C'est marrant, c'est justement le sujet de la semaine du Mooc du professeur Kordon (lien en rouge dans ma signature) !

  • Joanna CarterJoanna Carter Membre, Modérateur
    Dans un mot, UIPageViewController ?


  • Dans un mot, UIPageViewController ?




    Si y'a pas d'animations, un array, un bouton previous, un bouton next, un index et une image view.

  • Je mettrais un lien vers mon projet du MOOC, d'ici deux ou trois jours. Le cahier de charges est exactement ce que demande JustStart, avec quelques raffinements, comme la possibilité de scroller sur les images.

  • rollanorollano Membre
    avril 2017 modifié #8


    C'est marrant, c'est justement le sujet de la semaine du Mooc du professeur Kordon (lien en rouge dans ma signature) !




     


    je vais voir ça moi aussi :)




  • Si y'a pas d'animations, un array, un bouton previous, un bouton next, un index et une image view.




    c'est ca, compte tenu du nombre importants d'images, il faudrait que je les stocks quelque part et à  chaque fois qu un utilisateur clique sur un bouton l'application fait apparaitre l'image suivante pour revenir enfin à  la première image . Quel serait la meilleur façon de stocker des données pour une application ?   

  • LarmeLarme Membre
    avril 2017 modifié #10

    Si tes images sont dans ton bundle, le plus simple, c'est d'avoir un NSArray de NSString (le nom des images), et d'appeler [UIImage imageNamed:@leNomDeLImage] à  chaque fois que c'est nécessaire. 


    Sinon, garde les URLs des images, et gère un cache d'image pour ne pas avoir à  les retélécharger à  chaque fois.


  • DrakenDraken Membre
    avril 2017 modifié #11


    c'est ca, compte tenu du nombre importants d'images, il faudrait que je les stocks quelque part et à  chaque fois qu un utilisateur clique sur un bouton l'application fait apparaitre l'image suivante pour revenir enfin à  la première image . Quel serait la meilleur façon de stocker des données pour une application ?   




    ça dépend. C'est toujours les mêmes images ou elles peuvent changer (récupération d'un lot de graphismes à  partir d'un serveur, ajout de photo manuellement, etc ..) ? 


     


    Si c'est fixe, tu peux les insérer dans le projet, dossier Assets.xcassets, d'un simple drag&drop. Et les charger à  la demande en donnant juste un nom. Xcode s'occupe lui-même de tout le coté "casse-pied" stockage des images et récupération du chemin.  



    let image = UIImage(named: "Star_01")

    C'est la méthode que j'utilise pour l'exercice du MOOC (cours en ligne) sur le Swift que je dois finir avant lundi soir. (voir copie d'écran). Je stocke une quinzaine d'images d'affiches de film dans le dossier Assets.xcassets de mon projet.


     


    EDIT : Au final j'ai utilisé une autre méthode dans mon exercice. Les images sont stockées dans un répertoire du projet, où une fonction de chargement personnalisée vas les chercher (voir source plus bas).


     


    Je précise que le code que j'utilise est du Swift, alors que Larme est un vieux dinosaure (avec une image de fille peinte sur le front) employant encore l'Objective-C, le langage à  éviter par les débutants comme toi.




  • Si tes images sont dans ton bundle, le plus simple, c'est d'avoir un NSArray de NSString (le nom des images), et d'appeler [UIImage imageNamed:@leNomDeLImage] à  chaque fois que c'est nécessaire. 


    Sinon, garde les URLs des images, et gère un cache d'image pour ne pas avoir à  les retélécharger à  chaque fois.




    imageNamed Cette méthode utilise le cache système avant d'aller charger l'image. 

  • Au fait, pourquoi utiliser des boutons pour faire défiler les images ? Employer des gestures (balayage vers la droite et balayage vers la gauche) est une approche moderne, plus adapté à  un écran tactile que des boutons forcément petits. C'est plus esthétique en permettant d'utiliser la totalité de l'écran pour les images.



  • Au fait, pourquoi utiliser des boutons pour faire défiler les images ? Employer des gestures (balayage vers la droite et balayage vers la gauche) est une approche moderne, plus adapté à  un écran tactile que des boutons forcément petits. C'est plus esthétique en permettant d'utiliser la totalité de l'écran pour les images.




     


     


    Ton approche est interessante et j'ai trouvé un tuto qui pourrait m'aider dans ce sens, merci je vous tiens au courant . 

  • DrakenDraken Membre
    avril 2017 modifié #15

    Le lien de mon exercice (MOOC 2017 - initiation au développement iOS), traitant de l'affichage et du défilement d'un grand nombre d'images avec des effets de zoom. C'est du Swift. Certains éléments sont imposés dans le cadre de l'exercice, mais tu devrais y trouver des choses utiles.


     


    https://mooc-partage.lip6.fr/index.php/s/XWJJBNazscnFESB


     


    Il y a des choses supplémentaires comme l'affichage en superposition de citation de Star Wars. C'est un exemple d'utilisation des gestures et des UIView.animate().

  • JustStartJustStart Membre
    mai 2017 modifié #16

    Merci pour vos conseils, ils me sont très utiles. 


     


    Merci à  Draken pour ton aide. J'ai appris beaucoup dernièrement. 


     


    Exit l'image, j'ai ajouté un Label et un bouton supplémentaire qui aura pour fonction de modifier la couleur du fond d'écran et la couleur de la police du Label par la même occasion ( à  la place des images) . 


     


    Voila le code que j'ai : 



    import UIKit

    class ViewController: UIViewController {

    @IBOutlet weak var myLabel: UILabel!



    override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
    }

    @IBAction func colorLabel(_ sender: Any) {



    if myLabel.text == "A" {
    view.backgroundColor = UIColor.blue
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    }

    if myLabel.text == "D"{
    view.backgroundColor = UIColor.red
    }
    }


    @IBAction func changeLabel (_ sender: Any) {
    myLabel.text = PopLabel()
    self.view.backgroundColor = UIColor.white
    myLabel.textColor = UIColor(red: 0 , green:0, blue: 0, alpha: 1.0)


    }

    func PopLabel() -> String {
    let label = ["A", "C", "Z","Q", "B", "W", "X","J", "H", "L", "R","N","D", "G", "U","S"]
    return label[Int(arc4random_uniform(UInt32(label.count)))]

    }

    }

    Je Souhaite lorsque j'active le bouton colorLabel attribuer au valeurs ("A", "C", "Z","Q" etc ..)  une couleur de fond d'écran Bleu


    attribuer aux valeurs ("B", "W", "X","J", etc..)  une couleur de fond d'écran Vert.


    attribuer aux valeurs ("H", "L", "R","N" etc ...)  une couleur de fond d'écran Rouge.


    attribuer aux valeurs ("D", "G", "U","S" etc ...)  une couleur de fond d'écran Rouge.


     


    Comment je peux obtenir ce résultat sans devoir recopier pour chaque caracter : 



    if myLabel.text == "A" {
    view.backgroundColor = UIColor.blue
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)

    if myLabel.text == "C" {
    view.backgroundColor = UIColor.blue
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)

    if myLabel.text == "Z" {
    view.backgroundColor = UIColor.blue
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    ETC..

     

    En les regroupant dans un ensemble par exemple .

     

    Merci pour vos conseils ! 

  • Joanna CarterJoanna Carter Membre, Modérateur

    Quelque chose comme ci :



    switch myLabel.text
    {
    case "B", "W", "X", "J":
    view.backgroundColor = .green
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    case "H", "L", "R", "N":
    view.backgroundColor = .red
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    case "D", "G", "U", "S":
    view.backgroundColor = .blue
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    default:
    break
    }

    Et, s'il te plaà®t, utiliser les balises code la prochaine fois  ::)


  • Super merci mais impossible de lancer le programme  : raison : "Expression pattern of type "String" cannot match value of type 'String?'"


     


    Est-ce que tu sais comment changer ça ? 


     


    Merci 

  • Joanna CarterJoanna Carter Membre, Modérateur

    guard let text = myLabel.text else
    {
    return
    }

    switch text
    {
    case "B", "W", "X", "J":
    view.backgroundColor = .green
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    case "H", "L", "R", "N":
    view.backgroundColor = .red
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    case "D", "G", "U", "S":
    view.backgroundColor = .blue
    myLabel.font = myLabel.font.withSize(120)
    myLabel.textColor = UIColor(red: 200 , green:200, blue: 200, alpha: 1.0)
    default:
    break
    }
  • Tu m'enlèves une sacrée épine du pied.


     


    Je vous parlerai de mon application quand j'aurai terminé.


     


    Merci ! 


  • JustStartJustStart Membre
    mai 2017 modifié #21

    Coucou les amis !


     


    J'ai encore une question   :)


     


    J'ai ma tableview avec mes labels  , quand je choisis une cellule cela affiche le label de la cellule sur un viewcontroller à  partir duquel, maintenant j'aimerai ajouter un nouveau bouton "suivant"dans le viewcontroller qui permettrait d'afficher le label de la cellule suivante pour éviter de devoir revenir sur la tableview et ensuite sélectionné une nouvelle cellule . 


     


    Quelle fonction peut me permettre ça ? Ca doit être très simple je suis sur.


     


    Merci beaucoup à  Joanna ça m'a beaucoup aidé. 



    @IBOutlet weak var Label: UILabel!

    override func viewDidLoad()
    {
    super.viewDidLoad()

    QLabel.text = label[myIndex]

    QLabel.font = QLabel.font.withSize(288)
    }

  • Je n'ai pas tout compris. Peux-tu nous montrer des copies d'écran ?

  • Joanna CarterJoanna Carter Membre, Modérateur

    Je crois savoir ce que tu veux dire.


     


    Tu es passé d'une UITableView, par segue, vers un UIViewController, qui montre l'article sélectionné.


     


    Tu voudrais un bouton qui change le sujet du VC pour montrer l'article suivant dans la liste dans le VC


     


    Question 1 : comment tu tiens la référence à  l'article actuelle dans le VC ?


     


    Question 2 : qu'est-ce que attends comme article sélectionné dans la liste lorsque tu tapes sur le bouton "back" ?


     


    En bref, de l'action pour le bouton, il faut changer la référence dans le VC et mettre à  jour les controls là  dedans ; puis, tu dois ajouter un delegate, closure, ou qqch. comme ça, pour notifier la UITableViewController du changement de l'index.

  • JustStartJustStart Membre
    mai 2017 modifié #24

    @joanna ;


     


    "Tu es passé d'une UITableView, par segue, vers un UIViewController, qui montre l'article sélectionné.


     


    Tu voudrais un bouton qui change le sujet du VC pour montrer l'article suivant dans la liste dans le VC"


     


    C'est ça !


     


    Question 1 : comment tu tiens la référence à  l'article actuelle dans le VC ? :


    J'ai créé une variable avec les labels des cellules, qui seront rangées en fonction de la variable Index = 0 ,  j'ai ajouté la possibilité d'ajouter librement par l'utilisateur un item à  la liste (avec une fenêtre qui Popup) 


     


    Question 2 : qu'est-ce que attends comme article sélectionné dans la liste lorsque tu tapes sur le bouton "back" ? : Tu reviens sur ta liste mais je veux que l'utilisateur puisse changer d'item avec un bouton suivant et précédent.


     


    J'ai ajouté une screenshot tel que l'application apparait pour une meilleur compréhension, une image vaut mieux qu'un long discours avec un le fameux bouton suivant.


  • DrakenDraken Membre
    mai 2017 modifié #25

    Les boutons c'est le Mal ! Utilise plutôt des gestures swipe pour passer d'une image à  une autre. Je bricole un mini-exemple ce soir, pour te montrer comment faire. Je peux le faire en "code pur", ou avec Storyboard. Que préfères-tu ?

  • JustStartJustStart Membre
    mai 2017 modifié #26

    Récemment j'ai découvert un tuto pour créer un questionnaire et j'implémenterai 4 boutons dans le premier VC pour répondre à  la question qui sera affiché à  la place du label. D'ou l'idée du simple bouton suivant pour basculer sur la prochaine question. Ma question est est-ce que tu penses que la gesture swap est dans ce cas toujours la mieux adapté ?


     


    merci !


  • DrakenDraken Membre
    mai 2017 modifié #27

    Est-ce que tu préfère tourner les pages d'un livre de la façon habituelle ou en pressant sur des boutons "page précédente" et "page suivante" ?


     


    EDIT : On peut aussi utiliser les boutons et les gestures sur la même vue, de manière à  laisser le choix à  l'utilisateur.

  • Haha c'est vrai dit comme ça je vais devoir abandonner l'idée du bouton lol. Ca serait super si tu pouvais me faire parvenir le code pure si c'est pas trop compliqué pour naviguer d'une cellule à  l'autre . 


    Je peux te faire parvenir le code que j'ai dans la UItableview si besoins .


     


    merci.


  • Je te tape ça. C'est l'affaire de 10 minutes. Tu pourras ensuite l'adapter à  tes besoins.

  • Ca serait top, Merci !! J'espère que ca va marcher ! :) 


  • DrakenDraken Membre
    mai 2017 modifié #31

    Voici un exemple minimaliste avec un ViewController utilisant deux gestures sur sa vue principale :



    import UIKit

    class ViewController: UIViewController {

    override func viewDidLoad() {
    super.viewDidLoad()

    initialisationGestures()

    }

    func initialisationGestures() {
    // Création de la gesture Swipe Droit
    let swipeDroit = UISwipeGestureRecognizer(
    target: self,
    action: #selector(self.actionSwipeDroit))
    // Direction à  détecter
    swipeDroit.direction = .right
    // On ajoute la gesture à  la vue principale
    self.view.addGestureRecognizer(swipeDroit)

    // Même chose pour la gauche
    let swipeGauche = UISwipeGestureRecognizer(
    target: self,
    action: #selector(self.actionSwipeGauche))
    swipeGauche.direction = .left
    self.view.addGestureRecognizer(swipeGauche)

    }

    // Traitement Swipe Droit
    func actionSwipeDroit() {
    print (" ==> Droit ")
    }

    // Traitement Swipe Gauche
    func actionSwipeGauche() {
    print (" Gauche <==")
    }

    }


    Je viens de le tester :


     



     


     ==> Droit 


     ==> Droit 


     Gauche <==


     Gauche <==


     Gauche <==


     ==> Droit 


     


     


    Il détecte bien les gestures.


Connectez-vous ou Inscrivez-vous pour répondre.