Получить положение прокрутки UIPageViewController
Я использую UIPageViewController
, и мне нужно получить позицию прокрутки ViewController при проглатывании пользователей, чтобы я мог частично исчезать некоторые активы, пока представление переходит к следующему UIViewController
.
Методы делегата и datasource для UIPageViewController
, похоже, не предоставляют никакого доступа к этому, и внутренне я предполагаю, что UIPageViewController
должен использовать вид прокрутки где-то, но он не кажется прямым подкласс, поэтому я не могу позвонить
func scrollViewDidScroll(scrollView: UIScrollView) {
}
Я видел предложения некоторых других публикаций, чтобы получить ссылку на pageViewController!.view.subviews
, а затем первым индексом является scrollView, но это кажется очень взломанным. Мне интересно, есть ли более стандартный способ справиться с этим.
Ответы
Ответ 1
Вы можете искать UIScrollView внутри своего UIPageViewController
. Для этого вам нужно будет выполнить UIScrollViewDelegate
.
После этого вы можете получить свой scrollView:
for v in pageViewController.view.subviews{
if v.isKindOfClass(UIScrollView){
(v as UIScrollView).delegate = self
}
}
После этого вы можете использовать все UIScrollViewDelegate-методы, и поэтому вы можете переопределить метод scrollViewDidScroll
, где вы можете получить scrollPosition:
func scrollViewDidScroll(scrollView: UIScrollView) {
//your Code
}
Или если вы хотите однострочный:
let scrollView = view.subviews.filter { $0 is UIScrollView }.first as! UIScrollView
scrollView.delegate = self
Ответ 2
Похож на христианский ответ, но немного более похожий на Swift (и не излишне продолжая цикл через view.subviews):
for view in self.view.subviews {
if let view = view as? UIScrollView {
view.delegate = self
break
}
}
Ответ 3
Прокрутка UIPageViewController не работает, как обычное scrollview, и вы не можете получить scrollView.contentOffset, как и другие scrollView.
так что вот трюк, чтобы узнать, что происходит, когда пользователь прокручивает:
сначала вы должны найти scrollview и установить делегат на текущий viewController, как и другие ответы.
class YourViewController : UIPageViewController {
var startOffset = CGFloat(0) //define this
override func viewDidLoad() {
super.viewDidLoad()
//from other answers
for v in view.subviews{
if v is UIScrollView {
(v as! UIScrollView).delegate = self
}
}
}
.
.
.
}
extension YourViewController : UIScrollViewDelegate{
func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
startOffset = scrollView.contentOffset.x
}
public func scrollViewDidScroll(_ scrollView: UIScrollView) {
var direction = 0 //scroll stopped
if startOffset < scrollView.contentOffset.x {
direction = 1 //going right
}else if startOffset > scrollView.contentOffset.x {
direction = -1 //going left
}
let positionFromStartOfCurrentPage = abs(startOffset - scrollView.contentOffset.x)
let percent = positionFromStartOfCurrentPage / self.view.frame.width
//you can decide what to do with scroll
}
}