我正在使用uiPageViewController(底部的图像)编写一系列设置/设置屏幕。用户配置内容,然后滑动到下一个屏幕,依此类推。但我想锁定/禁用/阻止向前滑动,直到用户在当前屏幕中完成设置。
我试过了:
1)uiPageViewController.view.userInteractionEnabled = false。它会阻止屏幕中的所有内容,包括向后滑动。我想只阻止前锋。
2)
class VideoScreen extends Component {
constructor(props) {
super(props);
this._currentTime = this._currentTime.bind(this);
}
render() {
return (
<View refreshing>
{this._currentTime()}
</View>
)
}
_currentTime() {
return (
<View refreshing>
<Text>{VideoScreen._toHHMMSS(this.props.currentTime)}
</Text>
</View>
);
}
}
当func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {
if !forwardSwipeEnabled {
return nil
}
var index = contentViewControllers.indexOf(viewController)
index += 1
return contentViewControllers[index]
}
设置为return nil
时,到forwardSwipeEnabled
,并且它可以工作,但是即使在我更改forwardSwipeEnabled = true之后前向滑动仍然被阻止,因为UIPageViewController在场景中已经调用了此函数出现在屏幕上。
如果我再次前进和后退,该功能会再次被调用并且可以正常工作。
-----编辑-----
使用当前视图控制器调用false
不会刷新或再次调用该函数。
3)仅在用户完成后附加下一个屏幕(UIViewcontroller),但出现与2)相同的问题。
-----编辑-----
4)我可以使用pageViewController!.setViewControllers(viewControllers, direction: .Forward, animated: false, completion: nil)
获取gestureRecognizers,但设置view.subviews.first?.gestureRecognizers
可以阻止正向和反向。每个人都没有选择性地阻止不同的gestureRecognizer。
5)当方向前进或让它运行时截取手势并吃掉它,当向后移动时底部代码不起作用,因为用户可以开始向后滑动,触发功能返回并完成前进。 / p>
gestureRecognize.enabled = false
屏幕示例:
答案 0 :(得分:0)
作为建议,您可以在完成工作后使用setViewControllers:direction:animated:completion
重新加载数据源。这应该会修复你的下一页。
它的对象代码。它应该在swift中具有相同的代码。
答案 1 :(得分:0)
使用UIPageViewController的gestureRecognizers
属性。它是一组手势识别器。通过手势识别器循环设置每个isEnabled
到false
。准备好后,使用true
再次执行此操作。
更简单,只需将UIPageViewController的view
isUserInteractionEnabled
设置为false
,然后设置true
。
答案 2 :(得分:0)
这些年来您找到解决方案了吗? 我只找到一个:如果禁止前进,请立即返回:
func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
let pageContentViewController = pageViewController.viewControllers![0]
let currentPage = orderedViewControllers!.index(of: pageContentViewController)!
if !nextButton.isEnabled && currentPage > pageControl.currentPage {
DispatchQueue.main.asyncAfter(deadline: .now()+0.05, execute: {
self.setViewControllers([self.orderedViewControllers![self.pageControl.currentPage]], direction: .reverse, animated: false, completion: nil)
})
}
}