web-dev-qa-db-fra.com

Définissez par programmation le style de transition UIPageViewController sur Scroll

J'utilise Xcode 6 et implémente UIPageViewController pour mon application. J'ai suivi tutoriel appcoda , et tout fonctionne sauf les indicateurs de page. C'est parce que je ne peux pas définir le style de transition de UIPageViewController pour faire défiler.

Graphiquement, lorsque je clique sur PageViewController, l'onglet affiche View Controller au lieu de Page View Controller comme appcoda (Voir son image ci-dessous)

enter image description here

Voici à quoi ressemble la mienne:

enter image description here

Et oui, ma classe personnalisée est définie sur: UIPageViewController comme dans le didacticiel. enter image description here

Par programme, j'essaie de définir le style de transition avec:

    self.pageViewController.transitionStyle = UIPageViewControllerTransitionStyle.Scroll

mais il ne parvient pas à se construire, me disant qu'il Impossible de trouver le style de transition des membres . Une dernière chose étrange que je voudrais souligner est que si j'écris simplement self.pageViewController.transitionStyle, il se construit avec succès, mais il utilise toujours le Page Curl Transition.

Quelqu'un pourrait-il m'aider? J'utilise Swift, Xcode 6 et je développe sur le SDK iOS 8.

30
sameetandpotatoes

Vous obtenez une erreur car transitionStyle est une propriété en lecture seule. Si vous souhaitez définir le style de transition du contrôleur de page par programme, cela ne peut être fait que lors de l'initialisation avec la méthode:

init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation navigationOrientation: UIPageViewControllerNavigationOrientation, options options: [NSObject : AnyObject]!) { ... }

Plus d'informations dans la documentation .

37
Mick MacCallum

Puisque personne n'a répondu à la question. Le problème est que lorsque vous créez un UIPageViewController dans un conteneur, le conteneur est d'abord créé avec un UIViewController, et c'est le contrôleur pour lequel vous voyez vos options. Pour le corriger, vous devez supprimer UIViewController où vous définissez votre UIPageViewController personnalisé. Faites ensuite glisser UIPageViewController à partir du sélecteur de contrôles et connectez la séquence d'intégration du conteneur à ce contrôleur, puis vous pouvez définir votre contrôleur de pager personnalisé ainsi que définir la transition pour faire défiler.

30
Marcin D

Swift 3.

required init?(coder aDecoder: NSCoder) {
    super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
}
22
Cilvet

dans ios 8 Swift3

override init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : Any]? = nil) {
        super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: options)
    }

    required init?(coder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
19
Divyesh Gondaliya

Xcode 7.1 et Swift 2

Toutes les autres solutions n'ont pas entièrement fonctionné pour moi au dernier Swift, d'autant plus que ma classe hérite également de UIPageViewControllerDataSource et UIPageViewControllerDelegate.

Pour définir la transition de PageViewController sur .Scroll, ajoutez simplement ces 2 méthodes à votre classe:

override init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : AnyObject]?) {
    super.init(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: options)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
}
10
Sebastian

Le moyen le plus simple de le faire par programme dans Swift 2.0 (sans sous-classement):

class PageViewController: UIPageViewController {

     override init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation navigationOrientation: UIPageViewControllerNavigationOrientation, options options: [NSObject : AnyObject]!) {
          super.init(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: options) 
     }

}
7
PL175

Voici comment je résous ce problème dans Swift 2.0

1. Créé une classe qui est une sous-classe de UIPageViewController

    import UIKit

    class OPageViewController: UIPageViewController {

        override init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : AnyObject]?) {

           // Here i changed the transition style: UIPageViewControllerTransitionStyle.Scroll           
            super.init(transitionStyle: UIPageViewControllerTransitionStyle.Scroll, navigationOrientation: UIPageViewControllerNavigationOrientation.Horizontal, options: options)
        }

        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }

        override func viewDidLoad() {
            super.viewDidLoad()
        }


    }

2. que je viens de l'utiliser: D

pageController = OPageViewController()
pageController.dataSource = self
pageController.setViewControllers(NSArray(object: vc) as? [UIViewController], direction: .Forward, animated: true, completion: nil)
pageController.view.frame = CGRectMake(0, container.frame.Origin.y, view.frame.size.width, container.frame.size.height);
7
Dardan

Je le sais un peu tard, mais j'ai juste eu le même problème et j'ai réalisé qu'il était dû au fait que j'utilisais un simple UIViewController, même lorsque ma classe de contrôleur de vue personnalisée hérite d'un UIPageViewController, apparemment le menu graphique de xcode ne fonctionne pas reconnais le.

La solution consistait à supprimer dans le story-board le contrôleur de vue et à faire glisser un PageViewController pour le remplacer. Cela aura le menu graphique avec l'option de défilement.

6
Jorge Barboza

Swift 4 définit par programmation le style de transition de UIPageViewController

Cela vient directement de la ligne 61-97 de "UIPageViewController.h"

Mettez simplement ceci avant viewDidLoad () dans votre classe UIPageViewController ()

    override init(transitionStyle style: 
UIPageViewControllerTransitionStyle, navigationOrientation: UIPageViewControllerNavigationOrientation, options: [String : Any]? = nil) {
            super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
        }
        required init?(coder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
3
A. Welch

Il s'agit d'un bogue connu avec UIPageViewController

Vous pouvez lire une explication de la cause dans ceci SO question et plus en détail dans this one).

J'ai également utilisé le didacticiel AppCoda pour obtenir une poignée sur PageViewControllers. Un autre SO utilisateur a en fait écrit un Gist qui a résolu le problème pour moi d'une manière que je n'ai pas eu à changer une ligne de code dans mon propre projet. Déposez simplement AVC dans votre projet et appelez cela au lieu de UIPageViewController dans votre code.

Paul de Lange AlzheimerViewController .

1
Sean Dev

Aucune des solutions ci-dessous n'a fonctionné pour Swift 5. voici ce qui a fonctionné pour moi, dans mon cas, j'avais besoin que le contrôleur de vue soit présenté au-dessus de l'autre contrôleur de vue avec un faible fond d'opacité:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) {
    super.init(nibName: nil, bundle: nil)

    self.setupView()
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)

    self.setupView()
}

private func setupView() {
    self.modalTransitionStyle = .crossDissolve
    self.modalPresentationStyle = .overCurrentContext
    self.view.backgroundColor = UIColor.red.withAlphaComponent(0.3)
}
0
Shahriar