Xcode 6を使用し、アプリにUIPageViewController
を実装しています。 appcodaのチュートリアル に従いましたが、ページインジケータ以外はすべて機能します。これは、UIPageViewController
の遷移スタイルをスクロールに設定できないためです。
グラフィカルに、PageViewController
をクリックすると、appcoda
のようなページビューコントローラーではなく、ビューコントローラーがタブに表示されます(下の画像を参照)
これは私のものです:
そして、はい、私のカスタムクラスはUIPageViewController
に設定されています(チュートリアルのとおりです)。
プログラム的に、私は次のもので遷移スタイルを設定しようとします:
self.pageViewController.transitionStyle = UIPageViewControllerTransitionStyle.Scroll
しかし、ビルドに失敗し、メンバー遷移スタイルが見つかりませんでしたと教えてくれました。最後に指摘したいのは、self.pageViewController.transitionStyle
、正常にビルドされますが、Page Curl
移行。
誰も私を助けることができますか?私はSwift、Xcode 6を使用しており、iOS 8 SDKで開発しています。
transitionStyle
は読み取り専用プロパティであるため、エラーが発生しています。ページコントローラーの遷移スタイルをプログラムで設定する場合は、次のメソッドを使用して初期化中にのみ実行できます。
init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation navigationOrientation: UIPageViewControllerNavigationOrientation, options options: [NSObject : AnyObject]!) { ... }
詳細は ドキュメント にあります。
誰も質問に答えていないので。問題は、コンテナ内にUIPageViewControllerを作成すると、コンテナが最初にUIViewControllerで作成され、それがコントローラであり、オプションが表示されることです。これを修正するには、カスタムUIPageViewControllerを設定したUIViewControllerを削除する必要があります。次に、コントロールピッカーからUIPageViewControllerをドラッグし、コンテナから埋め込みセグエをそのコントローラーに接続します。その後、カスタムページャーコントローラーを設定し、スクロールへの移行を設定できます。
required init?(coder aDecoder: NSCoder) {
super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
}
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")
}
特に私のクラスも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)
}
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)
}
}
これは、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);
私はこれを少し遅く知っていますが、同じ問題があり、カスタムView ControllerクラスがUIPageViewControllerを継承していても、単純にUIViewControllerを使用しているために発生したことに気付きましたそれを認識します。
解決策は、ストーリーボードでView Controllerを削除し、PageViewControllerをドラッグして置き換えることでした。これには、スクロールオプション付きのグラフィックメニューがあります。
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")
}
これはUIPageViewControllerの既知のバグです
原因の説明は this SOの質問で、より包括的に this oneで読むことができます。
AppCoda Tutorialも使用して、PageViewControllersのハンドルを取得しました。別のSOユーザーが実際にGistを書いて、自分のプロジェクトのコード行を変更する必要がないように問題を解決しました。プロジェクトにAVCをドロップして、コードでUIPageViewControllerの代わりに呼び出します。
Paul de Langeの AlzheimerViewController 。
以下のソリューションはどれも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)
}