web-dev-qa-db-fra.com

Configuration d'UIScrollView pour qu'il glisse entre 3 contrôleurs de vue

J'essaie de configurer UIScrollView pour pouvoir glisser entre mes 3 contrôleurs de vue. Ceci est mon code dans AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.;

UIScrollView *sv = [[UIScrollView alloc] init];

BarsViewController *bvc = [[BarsViewController alloc] init]; // Create BarsViewController
StopwatchViewController *svc = [[StopwatchViewController alloc] init]; // Create StopwatchViewController
TimerViewController *tvc = [[TimerViewController alloc] init]; // Create TimerViewController

[sv addSubview:bvc.view];
[sv addSubview:svc.view];
[sv addSubview:tvc.view];

[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationFade]; // Hide status bar

self.window.rootViewController = sv;
[self.window makeKeyAndVisible];
return YES;
}

Cela donne une erreur sur cette ligne:

self.window.rootViewController = sv;

disant, "Types de pointeurs incompatibles affectant" UIViewController * "à partir de UIScrollView *" ".

Cependant, il n’existe pas de UIScrollViewController, je ne sais donc pas quoi faire.

En gros, je veux juste que tout l’écran soit en défilement, ce qui me permet de glisser entre mes 3 contrôleurs de vue. Comment pourrais-je m'y prendre?

13
user2397282

UPD: juin 2015 Swift

Le concept reste le même, décrit ci-dessous dans la section Objectif-C. Il y a un petit changement dans la syntaxe. Pour ajouter childviewcontroller, utilisez l'extrait suivant:

let aViewController = storyboard.instantiateViewControllerWithIdentifier("A") as! AViewController;

addChildViewController(aViewController);
scrollView!.addSubview(aViewController.view)
aViewController.didMoveToParentViewController(self)

Vérifiez mon Swift Github Sample Code

Objective-C

Créez votre propre contrôleur de vue de conteneur personnalisé (je l'appellerai combineViewController), qui tiendra vos trois contrôleurs en vue de défilement. Héritez comme vous le faites toujours avec UIViewController, puis utilisez l'API publique addChildViewController dans votre nouveau combineViewController -viewDidLoad: comme ceci:

[self addChildViewController:aViewController];
[self.scrollView addSubview:aViewController.view];
[aViewController didMoveToParentViewController:self];

Voici ce que fait le code:

  • Elle appelle la méthode addChildViewController: du conteneur pour ajouter l’enfant.
  • Il accède à la propriété de vue de l’enfant pour récupérer la vue et l’ajoute à sa propre hiérarchie de vues. Le conteneur définit la taille et la position de l’enfant avant d’ajouter la vue; les conteneurs choisissent toujours l’emplacement du contenu de l’enfant.
  • Il appelle explicitement la méthode didMoveToParentViewController: de l’enfant pour signaler que l’opération est terminée.

Effectuez cette opération avec chacun de vos viewControllers. Ensuite, définissez votre combineViewController en tant que rootViewController. 

si vous avez besoin d'explications supplémentaires, n'hésitez pas à demander.

Référence: Concevoir un contrôleur de vue de conteneur personnalisé

Voici votre Exemple de code Github Objective-C

UPD: Merci @Oliver Atkinson pour avoir clarifié le fait que la méthode addChildViewController: appelle également la méthode willMoveToParentViewController: de l’enfant automatiquement. 

Résultats:

 enter image description here

38
Neil Galiaskarov
    let obj1 = self.storyboard?.instantiateViewControllerWithIdentifier("DocumentsVC") as! DocumentsVC
    let obj2 = self.storyboard?.instantiateViewControllerWithIdentifier("AppointmentsVC") as! AppointmentsVC
    let obj3 = self.storyboard?.instantiateViewControllerWithIdentifier("DashboardVC") as! DashboardVC

    self.containerScrollView.frame = obj2.view.frame

    self.containerScrollView.addSubview(obj2.view)
    obj2.willMoveToParentViewController(self)
    self.addChildViewController(obj2)

    self.containerScrollView.addSubview(obj1.view)
    obj1.willMoveToParentViewController(self)
    self.addChildViewController(obj1)

    self.containerScrollView.addSubview(obj3.view)
    obj3.willMoveToParentViewController(self)
    self.addChildViewController(obj3)

    self.containerScrollView.contentSize = CGSizeMake(3*UIScreen.mainScreen().bounds.width, 0)

    obj1.view.frame.Origin =  CGPointMake(0, 0)
    obj2.view.frame.Origin =  CGPointMake(UIScreen.mainScreen().bounds.width, 0)
    obj3.view.frame.Origin = CGPointMake(2*UIScreen.mainScreen().bounds.width, 0)
2
sachin

Swift 3.0

Basé sur la réponse de Sachin - un peu plus générique - ajoutez simplement l'élément suivant au tableau de vues

var views = [ViewController(), ViewController2(), ViewController3(), ViewController4()]

func setupScrollView() {
    scrollView.frame = views.first!.view.frame
    scrollView.contentSize = CGSize(width: CGFloat(views.count) * width, height: 0)
    _ = views.map({ addViewToScrollView($0) })
    _ = views.map({ $0.view.frame.Origin =  CGPoint(x: CGFloat(views.index(of: $0)!) * width, y: 0) })
}

func addViewToScrollView(_ viewController: UIViewController) {
    scrollView.addSubview(viewController.view)
    views.willMove(toParentViewController: self)
    addChildViewController(viewController)
}
2
chrisco

Essayez ce dépôt Git. En utilisant ce dépôt, vous pouvez créer une navigation dans les vues telle que Pages principales de Snapchat/Tinder.

https://github.com/goktugyil/EZSwipeController

1
Jayesh Thanki