以编程方式将UIPageViewController Transition Style设置为Scroll

sam*_*oes 31 ios swift ios8

我正在使用Xcode 6并实现UIPageViewController我的应用程序.我遵循了appcoda的教程,除页面指示器外,一切正常.这是因为我无法设置UIPageViewController滚动的过渡样式.

从图形上看,当我点击它时PageViewController,标签显示View Controller而不是Page View Controller就像appcoda(见下图)

在此输入图像描述

这就是我的样子:

在此输入图像描述

是的,我的自定义类设置为:UIPageViewController在教程中. 在此输入图像描述

以编程方式,我尝试设置过渡样式:

    self.pageViewController.transitionStyle = UIPageViewControllerTransitionStyle.Scroll
Run Code Online (Sandbox Code Playgroud)

但它无法构建,告诉我它无法找到成员转换风格.我想指出的最后一个奇怪的事情是,如果我只是编写self.pageViewController.transitionStyle,它会成功构建,但它仍然使用Page CurlTransition.

谁能帮助我?我正在使用Swift,Xcode 6,并在iOS 8 SDK上进行开发.

Mic*_*lum 38

您收到错误,因为它transitionStyle是一个只读属性.如果要以编程方式设置页面控制器的过渡样式,则只能在使用以下方法初始化期间完成:

init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation navigationOrientation: UIPageViewControllerNavigationOrientation, options options: [NSObject : AnyObject]!) { ... }
Run Code Online (Sandbox Code Playgroud)

文档中的更多信息.

  • Interface Builder中特别有一个UIPageViewController图标.您是否正在使用此而不是拖出UIViewController并将其自定义类更改为UIPageViewController? (7认同)

Mar*_*n D 31

由于没有人回答这个问题.问题是,当您在Container中创建UIPageViewController时,首先使用UIViewController创建容器,并且您可以看到控制器的选项.为了解决这个问题,你必须删除UIViewController,你可以在其中设置自定义UIPageViewController.然后从控件选择器拖动UIPageViewController并将嵌入segue从容器连接到该控制器,然后您可以设置自定义寻呼机控制器以及设置转换到滚动.

  • 正是这样!我是来回答这个问题的,但你已经做到了。:) 为你点赞。所有其他答案都有效,但潜在的问题是这个。:) (2认同)
  • 这是正确的解决方案,应同样接受。 (2认同)

Cil*_*vet 26

Swift 3.0

required init?(coder aDecoder: NSCoder) {
    super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
}
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢这样做......我们不是在触发世界末日而不调用 init(coder:) 初始值设定项吗? (2认同)

Div*_*iya 20

在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")
    }
Run Code Online (Sandbox Code Playgroud)

  • 在这里没有故事板的好解决方案。简单明了。 (2认同)
  • THIS is the right answer. Applied in Xcode 9.1 & Swift 4 (2认同)

Seb*_*ian 10

Xcode 7.1和Swift 2

在最新的Swift中,所有其他解决方案都不能完全适用于我,特别是因为我的类也继承了UIPageViewControllerDataSource和UIPageViewControllerDelegate.

要将PageViewController转换设置为.Scroll,只需将这两个方法添加到您的类中:

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)
}
Run Code Online (Sandbox Code Playgroud)


PL1*_*175 8

在Swift 2.0中以编程方式执行此操作的最简单方法(无子类化):

class PageViewController: UIPageViewController {

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

}
Run Code Online (Sandbox Code Playgroud)

  • 这是_is_子类. (6认同)

Dar*_*dan 7

这就是我在Swift 2.0中解决这个问题的方法

1.创建了一个类,它是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()
        }


    }
Run Code Online (Sandbox Code Playgroud)

我只是用它: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);
Run Code Online (Sandbox Code Playgroud)


eve*_*evF 7

Swift 5 & 4:只需将这 2 个函数放在您的页面视图 VC 中的 viewDidLoad() 之前

override init(transitionStyle style: UIPageViewController.TransitionStyle, navigationOrientation: UIPageViewController.NavigationOrientation, options: [UIPageViewController.OptionsKey : Any]? = nil) {
    super.init(transitionStyle: .pageCurl, navigationOrientation: .horizontal, options: nil)
}

required init?(coder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我知道这有点晚了,但我遇到了同样的问题并意识到它起源于我使用的是简单的UIViewController,即使我的自定义视图控制器类继承自UIPageViewController,显然xcode的图形菜单没有认识到它.

解决方案是在故事板中删除视图控制器并拖动PageViewController来替换它.这将具有带滚动选项的图形菜单.


Shi*_*ish 5

这对我有用。因为如果我重写了transitionStyle的init,如果你在Storyboard的容器视图中设置了pageViewController,它就永远不会被调用。

required init?(coder aDecoder: NSCoder) {

        super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
    }
Run Code Online (Sandbox Code Playgroud)