我正在使用a UIPageViewController,我需要在用户滑动时获取ViewController的滚动位置,这样我可以在视图转换到下一个视图时部分淡化某些资源UIViewController.
委托和数据源方法UIPageViewController似乎没有提供对此的任何访问,并在内部我假设UIPageViewController必须在某处使用滚动视图,但它似乎没有直接子类化它所以我不能呼叫
func scrollViewDidScroll(scrollView: UIScrollView) {
}
Run Code Online (Sandbox Code Playgroud)
我已经看到一些其他帖子建议获取引用pageViewController!.view.subviews然后第一个索引是一个scrollView,但这似乎非常 hacky.我想知道是否有更标准的方法来处理这个问题.
Chr*_*örz 38
您可以在自己的内部搜索UIScrollView UIPageViewController.要做到这一点,你必须实现UIScrollViewDelegate.
之后你可以得到你的scrollView:
for v in pageViewController.view.subviews{
if v.isKindOfClass(UIScrollView){
(v as UIScrollView).delegate = self
}
}
Run Code Online (Sandbox Code Playgroud)
之后,您可以使用所有UIScrollViewDelegate方法,因此您可以覆盖scrollViewDidScroll可以获取scrollPosition的方法:
func scrollViewDidScroll(scrollView: UIScrollView) {
//your Code
}
Run Code Online (Sandbox Code Playgroud)
或者如果你想要一个单行:
let scrollView = view.subviews.filter { $0 is UIScrollView }.first as! UIScrollView
scrollView.delegate = self
Run Code Online (Sandbox Code Playgroud)
类似于Christian的答案,但有点像Swift一样(并且没有不必要地继续遍历view.subviews):
for view in self.view.subviews {
if let view = view as? UIScrollView {
view.delegate = self
break
}
}
Run Code Online (Sandbox Code Playgroud)
UIPageViewController滚动不能像普通的scrollview一样工作,并且您不能像其他scrollViews一样获得scrollView.contentOffset。
因此,这里有个技巧,可让用户了解滚动时发生的情况:
首先,您必须找到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
}
}
Run Code Online (Sandbox Code Playgroud)