Подтвердить что ты не робот

Программно задайте стиль перехода 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.

4b9b3361

Ответ 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.

Ответ 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
}

}