Программно задайте стиль перехода UIPageViewController для прокрутки
Я использую 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 и разрабатываю SDK для iOS 8.
Ответы
Ответ 1
Вы получаете сообщение об ошибке, поскольку transitionStyle
- свойство readonly. Если вы хотите программным образом настроить стиль перехода для контроллера страницы, его можно выполнить только при инициализации с помощью метода:
init(transitionStyle style: UIPageViewControllerTransitionStyle, navigationOrientation navigationOrientation: UIPageViewControllerNavigationOrientation, options options: [NSObject : AnyObject]!) { ... }
Дополнительная информация в документации.
Ответ 2
Так как никто не ответил на вопрос. Проблема в том, что при создании UIPageViewController внутри контейнера контейнер сначала создается с помощью UIViewController, и это контроллер, на котором вы видите свои параметры. Чтобы исправить это, вы должны удалить UIViewController, где вы устанавливаете свой пользовательский UIPageViewController. Затем перетащите UIPageViewController из набора элементов управления и подключите встроенный сегмент из контейнера к этому контроллеру, затем вы можете настроить свой пользовательский контроллер пейджера, а также установить переход для прокрутки.
Ответ 3
Swift 3.0
required init?(coder aDecoder: NSCoder) {
super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)
}
Ответ 4
в 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")
}
Ответ 5
Xcode 7.1 и Swift 2
Все другие решения не полностью работали для меня в самом начале Swift, тем более что мой класс также наследуется от UIPageViewControllerDataSource и UIPageViewControllerDelegate.
Чтобы установить переход 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)
}
Ответ 6
Вот как я решаю эту проблему в 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
Самый простой способ сделать это программно в 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)
}
}
Ответ 8
Я знаю это немного позже, но у меня была такая же проблема, и я понял, что она возникла из-за того, что я использовал простой UIViewController, даже когда мой пользовательский класс контроллера классов наследуется от UIPageViewController, а графическое меню xcode не распознает его.
Решение заключалось в том, чтобы удалить в панели рассказов контроллер представления и перетащить элемент PageViewController, чтобы заменить его. Это будет графическое меню с опцией прокрутки.
Ответ 9
Swift 4 программно устанавливает стиль перехода UIPageViewController
Это прямо из строки "UIPageViewController.h" 61-97
Просто поместите это перед viewDidLoad() в вашем классе 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")
}
Ответ 10
Это известная ошибка с UIPageViewController
Вы можете прочитать объяснение причины в этом вопросе SO и более подробно в этом.
Я также использовал учебник AppCoda, чтобы получить ручку на PageViewControllers. Другой пользователь SO фактически написал суть, которая решила проблему для меня таким образом, что мне не пришлось менять строку кода в моем собственном проекте. Просто отпустите AVC в свой проект и вызовите это вместо UIPageViewController в свой код.
Пол де Ланге AlzheimerViewController.
Ответ 11
Я загружаю пример кода в swift5 с информацией других людей. https://github.com/sun5022/UIPageViewController
Ответ 12
Ни одно из приведенных ниже решений не сработало для 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)
}
Ответ 13
swift 3 xcode 8 in
class...: UIPageViewController {
override var transitionStyle: UIPageViewControllerTransitionStyle {
return .scroll
}
override var navigationOrientation: UIPageViewControllerNavigationOrientation {
return .horizontal
}
}