web-dev-qa-db-ja.com

プログラムでUIPageViewController Transition StyleをScrollに設定します

Xcode 6を使用し、アプリにUIPageViewControllerを実装しています。 appcodaのチュートリアル に従いましたが、ページインジケータ以外はすべて機能します。これは、UIPageViewControllerの遷移スタイルをスクロールに設定できないためです。

グラフィカルに、PageViewControllerをクリックすると、appcodaのようなページビューコントローラーではなく、ビューコントローラーがタブに表示されます(下の画像を参照)

enter image description here

これは私のものです:

enter image description here

そして、はい、私のカスタムクラスはUIPageViewControllerに設定されています(チュートリアルのとおりです)。 enter image description here

プログラム的に、私は次のもので遷移スタイルを設定しようとします:

    self.pageViewController.transitionStyle = UIPageViewControllerTransitionStyle.Scroll

しかし、ビルドに失敗し、メンバー遷移スタイルが見つかりませんでしたと教えてくれました。最後に指摘したいのは、self.pageViewController.transitionStyle、正常にビルドされますが、Page Curl移行。

誰も私を助けることができますか?私はSwift、Xcode 6を使用しており、iOS 8 SDKで開発しています。

30

transitionStyleは読み取り専用プロパティであるため、エラーが発生しています。ページコントローラーの遷移スタイルをプログラムで設定する場合は、次のメソッドを使用して初期化中にのみ実行できます。

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

詳細は ドキュメント にあります。

37
Mick MacCallum

誰も質問に答えていないので。問題は、コンテナ内にUIPageViewControllerを作成すると、コンテナが最初にUIViewControllerで作成され、それがコントローラであり、オプションが表示されることです。これを修正するには、カスタムUIPageViewControllerを設定したUIViewControllerを削除する必要があります。次に、コントロールピッカーからUIPageViewControllerをドラッグし、コンテナから埋め込みセグエをそのコントローラーに接続します。その後、カスタムページャーコントローラーを設定し、スクロールへの移行を設定できます。

30
Marcin D

Swift 3.

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

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

Xcode 7.1&Swift 2

特に私のクラスもUIPageViewControllerDataSourceおよびUIPageViewControllerDelegateを継承するため、他のすべてのソリューションは最新のSwiftでは完全に機能しませんでした。

PageViewController遷移を.Scrollに設定するには、次の2つのメソッドをクラスに追加します。

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

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) 
     }

}
7
PL175

これは、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()
        }


    }

2.ちょうど私がそれを使用したより: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

私はこれを少し遅く知っていますが、同じ問題があり、カスタムView ControllerクラスがUIPageViewControllerを継承していても、単純にUIViewControllerを使用しているために発生したことに気付きましたそれを認識します。

解決策は、ストーリーボードでView Controllerを削除し、PageViewControllerをドラッグして置き換えることでした。これには、スクロールオプション付きのグラフィックメニューがあります。

6
Jorge Barboza

Swift 4はプログラムでUIPageViewControllerの遷移スタイルを設定します

これは、 'UIPageViewController.h'行61-97から直接です。

UIPageViewController()クラスのviewDidLoad()の前にこれを置くだけです

    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

これはUIPageViewControllerの既知のバグです

原因の説明は this SOの質問で、より包括的に this oneで読むことができます。

AppCoda Tutorialも使用して、PageViewControllersのハンドルを取得しました。別のSOユーザーが実際にGistを書いて、自分のプロジェクトのコード行を変更する必要がないように問題を解決しました。プロジェクトにAVCをドロップして、コードでUIPageViewControllerの代わりに呼び出します。

Paul de Langeの AlzheimerViewController

1
Sean Dev

以下のソリューションはどれもSwift 5。

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