2015-12-15 7 views
1

Comment faire une vue en boucle infinie pour UIScrollView?UIScrollView horizontal avec boucle infinie dans swift

Example of what I want

Disons que j'ai une collection var subViews = [1,2,3,4,5,6]. Je veux créer UIScrollView avec cette collection

for subview in subViews { 
    uiscrollview.addSubview(subview) 
} 

mais je ne veux pas remplir mon ScrollView avec tous les éléments de cette collection. Il devrait être seulement trois articles toujours comme [1,2,3] ou [2,3,4] ou [5,6,1]

j'ai trouvé this library, mais son Objective-C.

Merci d'avance.

Upadate:

let page = Int(floor((pageScrollView.contentOffset.x * 2.0 + pageWidth)/(pageWidth * 2.0))) 

    let firstPage = page - 1 
    let lastPage = page + 1 

     for index in 0..<subViews.count{ 
      let subview = subViews[index] 
      if index != firstPage || index != lastPage { 
       subview.removeFromSuperview() 
       subpageViewControlls[index] = nil 
      } 
     } 
+0

Vous pouvez utiliser la bibliothèque objective-c dans swift en ajoutant un en-tête de pont. Voir ceci: https://developer.apple.com/library/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html – NeverHopeless

+0

merci mais j'ai déjà fait beaucoup de choses avec ScrollView Delegate, alors maintenant je ne peux pas passer à cette classe objective-c. tous j'ai besoin de la même logique/algorithme comme cela objective-c lib. –

+0

J'y réfléchirais à deux fois si j'étais vous. 'UIPageViewController' fait exactement ce que vous voulez, mais il semble que vous ayez écrit du code pour vous connecter à d'autres choses. Les chances sont que vous trouverez plus facile de refactoriser votre code pour utiliser une bibliothèque (qui à son tour signifie probablement Objective-C) ou 'UIPageViewController' alors trouvez simplement une façon différente de faire votre" beaucoup de choses avec le délégué ScrollView. " – TwoStraws

Répondre

1

Vous avez deux options ici. Tout d'abord, quelque chose comme iCarousel vous permettrait de créer des vues en boucle infiniment facilement - vous dites simplement comment vous voulez que chaque vue est configurée, et vous avez terminé. Je suggère que c'est la solution préférée pour la facilité et la maintenabilité.

Une deuxième solution consiste à utiliser UIPageViewController pour gérer le balayage entre les pages, mais cela nécessiterait que vous implémentiez la boucle vous-même. Merci à la façon dont UIPageViewController est mis en œuvre, c'est trivial: il suffit que vous utilisez le module ou similaire dans ces deux:

pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) 
pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) 

Ces deux options charge paresseux que vous auriez jamais à charger plus de trois points de vue à un temps.

Mise à jour: OP a commenté qu'ils ont déjà beaucoup de code pour le délégué de la vue déroulante. En supposant qu'ils sont incapables de remplacer ce code et d'utiliser quelque chose comme UIPageViewController, la solution ici est effectivement de recréer le comportement de UIPageViewController dans la vue de défilement existante qui est utilisée. Attention: Je ne recommanderais pas cette solution par rapport à l'utilisation de quelque chose de dédié pour ce travail.

1) Implémentez scrollViewDidScroll(scrollView: UIScrollView) afin de savoir quand l'utilisateur a défilé.

2) Calculer qui « page » ils sont utiliser quelque chose comme let page = floor((scrollView.contentOffset.x - yourPageWidthHere/2)/yourPageWidthHere) + 1; (écrit de la mémoire,! S'il vous plaît vérifier) ​​

3) pré-charge toutes les pages de votre tableau qui sont à cette page +/- 1 Déchargez toutes les autres pages en les remplaçant par NSNull dans votre tableau de contrôleurs de vue afin que les positions ne bougent pas.

4) Mettez à jour la propriété contentSize de votre vue de défilement pour permettre à l'utilisateur de continuer le défilement. Si vous vouliez revenir à un point antérieur, vous pourriez le faire, mais je ne pense pas que cela aurait un effet sur la performance.

+0

s'il vous plaît vérifier cette vidéo de capture d'écran [link] (https://www.dropbox.com/s/mow33cab4qfk6v9/screen.mov?dl=0), je pense que c'est impossible à faire avec 'UIPageViewController' (navigation haut) –

+0

I a fourni une solution basée sur 'UIScrollView'. Ce n'est pas difficile à faire de cette façon, mais cela demande beaucoup de code. – TwoStraws

+0

NB: Si vous n'avez jamais géré un tableau de contrôleurs de vue, l'exemple de code "PageControl" d'Apple vous aidera à démarrer. En particulier, voir [ce fichier où l'approche exacte est utilisée] (https://developer.apple.com/library/ios/samplecode/PageControl/Listings/Classes_iPhone_RootViewController_m.html#//apple_ref/doc/uid/DTS40007795-Classes_iPhone_RootViewController_m -DontLinkElementID_20) – TwoStraws