2015-01-18 19 views
5

Chciałbym zmienić moją animację między widokiem. Obecnie mam PageCurl, ale chciałbym mieć animację przewijania, taką jak Snapchat.Przejście strony PageCurl do przewijania za pomocą UIPageViewController

nie mogę użyć var transitionStyle: UIPageViewControllerTransitionStyle { get }

enter image description here

Moje ViewController:

import UIKit 

class ViewController: UIPageViewController, UIPageViewControllerDataSource{ 

    let pageViewController = UIPageViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil) 
    var messagesViewController : MessagesViewController! 
    var searchViewController : SearchViewController! 
    var friendsViewController : FriendsViewController! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // set UIPageViewControllerDataSource 
     self.dataSource = self 

     // Reference all of the view controllers on the storyboard 
     self.messagesViewController = self.storyboard?.instantiateViewControllerWithIdentifier("messagesViewController") as? MessagesViewController 
     self.messagesViewController.title = "Messages" 

     self.searchViewController = self.storyboard?.instantiateViewControllerWithIdentifier("searchViewController") as? SearchViewController 
     self.searchViewController.title = "Search" 

     self.friendsViewController = self.storyboard?.instantiateViewControllerWithIdentifier("friendsViewController") as? FriendsViewController 
     self.friendsViewController.title = "Friends" 

     // Set starting view controllers 
     var startingViewControllers : NSArray = [self.searchViewController] 
     self.setViewControllers(startingViewControllers, direction: .Forward, animated: false, completion: nil) 
    } 


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

     switch viewController.title! { 
     case "Messages": 
      return nil 
     case "Search": 
      return messagesViewController 
     case "Friends": 
      return searchViewController 
     default: 
      return nil 
     } 
    } 

    // pink green blue 

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

     switch viewController.title! { 
     case "Messages": 
      return searchViewController 
     case "Search": 
      return friendsViewController 
     case "Friends": 
      return nil 
     default: 
      return nil 

     } 
    } 

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

} 

Odpowiedz

10

Z Apple Docs:

„Wartość tej właściwości jest ustawiona, gdy strona kontroler widoku jest inicjowany i nie można go zmienić. "

Musisz określić styl przejścia podczas inicjalizacji. Jeśli tak, że w kodzie, trzeba będzie coś takiego:

let pageViewController = ViewController(transitionStyle: .Scroll, navigationOrientation: .Horizontal, options: nil) 

(Od ViewController jest podklasą UIPageViewController)

Jeśli konfigurujesz stronę View Controller w serii ujęć, zmienić styl przejścia w Inspektorze atrybuty:

Image of attributes inspector

+0

Z ostatniej wersji Xcode mam wybrać „Flip poziomy” w stylu przejściowym na placu zabaw. ale nic nie działa. Dodaję let pageViewController również mais, ale nic się nie zmieni:/ – Pixel

+2

'UIPageViewController' ma tylko dwa style przejścia:' Scroll' lub 'PageCurl'. 'FlipHorizontal' to' UIModalTransitionStyle' używany, gdy kontroler widoku jest prezentowany modalnie. Jeśli chcesz FlipHorizontal lub coś podobnego, będziesz musiał użyć czegoś innego niż UIPageViewController. – pbasdf

+0

Nie chcę tego samego przejścia niż snapchat, jak mogę to zrobić, proszę. – Pixel

2

Jeśli trzeba użyć storyboard i jeszcze trzeba ustawić styl przejścia w kodzie można użyć tego triku w klasie utworzonego i nterowanie UIPageViewController. Sztuką jest to, że w super.init startowych z koder ty call(), która zajmuje się ten styl przejścia

class ViewController: UIPageViewController { 

    required init?(coder: NSCoder) { 
     super.init(transitionStyle: Configs.transitionStyle, navigationOrientation: .horizontal, options: nil) 
    } 
} 
+0

To działa dla mnie, ale to nie znaczy, żebym nie dzwonił do init (koder :) inicjator ... Nie jestem pewien, czy powinniśmy to zrobić to ... –

+0

Działa świetnie, dzięki! – Cesare