2017-09-18 4 views
1

J'ai un UIPageViewController dans l'un de mon UICollectionViewCell en haut de mon écran (height = frame.height/3) il contient un certain nombre d'images et il fonctionne bien, mais je dois le faire défiler vers l'image suivante automatiquement toutes les 3 secondes que dois-je faire?UIpageViewController et minuterie

import UIKit 

class PageViewController: UIPageViewController , UIPageViewControllerDataSource{ 

    var scrollingTimer = Timer() 
    let imageNames = ["Apple_Watch_Main" , "Pic2" , "Pic3"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     dataSource = self 
     let frameViewController = FrameViewController() 
     frameViewController.imageName = imageNames.first 

     let viewControllers = [frameViewController] 
     setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil) 

    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 

     let currentImageName = (viewController as! FrameViewController).imageName 
     let currentIndex = imageNames.index(of: currentImageName!) 
     if currentIndex! > 0 { 
      let frameViewController = FrameViewController() 
      frameViewController.imageName = imageNames[currentIndex! - 1] 
      return frameViewController 
     } 
     return nil 
    } 

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 

     let currentImageName = (viewController as! FrameViewController).imageName 
     let currentIndex = imageNames.index(of: currentImageName!) 
     if currentIndex! < imageNames.count - 1 { 
      let frameViewController = FrameViewController() 
      frameViewController.imageName = imageNames[currentIndex! + 1] 
      return frameViewController 
     } 
     return nil 
    } 
} 

et j'ajouté à ma cellule ici

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 

     switch indexPath.item { 
     case 0 : 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: cellId, for: indexPath) as!ImageCell 

      let pagecontroller = PageViewController(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil) 
      self.addChildViewController(pagecontroller) 

      cell.addSubview(pagecontroller.view) 

      pagecontroller.view.frame = CGRect(x: 0, y: 0, width: view.frame.width, height: view.frame.height/3) 
      return cell 
     case 1 : 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "filterandorganize", for: indexPath) as! FilterAndOrganize 
      return cell 
     case 2 : 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Offers", for: indexPath) as! Offers 
      return cell 
     case 3 : 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "OfferedProducts", for: indexPath) as! OfferedProducts 
      cell.firstViewController = self 
      return cell 
     default: 
      let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Offers", for: indexPath) as! Offers 
      return cell 
     } 
    } 

en cas 0

J'ai cherché beaucoup et je l'ai trouvé quelques questions comme celle-ci, mais sans aucune réponse complète et correcte

VOICI LA RÉPONSE QUE J'AI TROUVÉE mais elle a toujours un bug et c'est quand l'utilisateur le fait glisser soi-même que l'autodéploiement n'est pas parfait et peut-être sauter d'une image à l'autre

class PageViewController: UIPageViewController , UIPageViewControllerDataSource{ 
    var index = 0 
    let imageNames = ["Apple_Watch_Main" , "Pic2" , "Pic3"] 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     dataSource = self 

     let frameViewController = FrameViewController() 
     frameViewController.imageName = imageNames[index] 
     index += 1 
     let viewControllers = [frameViewController] 
     setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil) 

     Timer.scheduledTimer(timeInterval: 6.0 , 
          target: self, 
          selector: #selector(myFunc(_:)), 
          userInfo: index, 
          repeats: true) 
    } 
    //FIXME: needs some fixes 
    func myFunc(_ timer: Timer) { 
     if index == imageNames.count { 
      index = 0 
     } 
     else { 
      self.changePIC(index) 
      index += 1 
     } 
    } 
    func changePIC(_ i: Int) { 
     let frameViewController = FrameViewController() 
     frameViewController.imageName = imageNames[i] 
     let viewControllers = [frameViewController] 
     setViewControllers(viewControllers, direction: .forward, animated: true, completion: nil) 
    } 

Répondre

0

caisse d'abord une minuterie avec timeInterval et l'option siège repeats true.

Exemple:

Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(scrollToNextItem), userInfo: nil, repeats: true)

Maintenant vous avez Timer qui déclenchera la méthode scrollToNextItem toutes les 3 secondes.

Maintenant, lisez à propos de setViewControllers(_:direction:animated:completion:) pour savoir comment régler les contrôleurs de vue à afficher. Puis implémenter la méthode scrollToNextItem avec la logique requise.

+0

je vous remercie beaucoup pour votre réponse rapide ... il y a une chose que je ne sais toujours pas ... j'ai placé mon viewcontroller déjà mais je ne sais pas où et comment implémenter la fonction de cible "scrollRoNextItem" –