我有一个漂亮的标准UIPageViewController
,可以加载3个单独的UIViewController
,以进行滑动。
这些UIViewController
中的一个需要UIScrollView,该UIScrollView仍可在不触发UIPageViewController
的手势识别器的情况下运行。
如果触摸是从那里开始的,那么如何将其限制为UIScrollView
,所以它不会触发过渡?
UIPageViewController源:
class MyPageViewController: UIPageViewController
{
fileprivate lazy var pages: [UIViewController] = {
return [
self.getViewController(withIdentifier: "MyPage1"),
self.getViewController(withIdentifier: "MyPage2"),
self.getViewController(withIdentifier: "MyPage3"),
]
}()
fileprivate func getViewController(withIdentifier identifier: String) -> UIViewController
{
return UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: identifier)
}
var imageView: UIImageView?
var backgroundVideo : VideoBackground!
override func viewDidLoad()
{
super.viewDidLoad()
self.dataSource = self
self.delegate = self as? UIPageViewControllerDelegate
if let firstVC = pages.first
{
setViewControllers([firstVC], direction: .forward, animated: true, completion: nil)
}
}
}
extension MyPageViewController: UIPageViewControllerDataSource
{
func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
guard let viewControllerIndex = pages.index(of: viewController) else { return nil }
let previousIndex = viewControllerIndex - 1
guard previousIndex >= 0 else { return nil }
guard pages.count > previousIndex else { return nil }
return pages[previousIndex]
}
func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController?
{
guard let viewControllerIndex = pages.index(of: viewController) else { return nil }
let nextIndex = viewControllerIndex + 1
guard nextIndex < pages.count else { return nil }
guard pages.count > nextIndex else { return nil }
return pages[nextIndex]
}
private func setupPageControl() {
let appearance = UIPageControl.appearance()
appearance.pageIndicatorTintColor = UIColor.black
appearance.currentPageIndicatorTintColor = UIColor.white
appearance.backgroundColor = UIColor.clear
appearance.isOpaque = false
}
func presentationCount(for pageViewController: UIPageViewController) -> Int {
setupPageControl()
return self.pages.count
}
func presentationIndex(for pageViewController: UIPageViewController) -> Int {
return 0
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
for view in self.view.subviews {
if view is UIScrollView {
view.frame = UIScreen.main.bounds
} else if view is UIPageControl {
view.backgroundColor = UIColor.clear
}
}
}
}
extension MyPageViewController: UIPageViewControllerDelegate {}
如果scrollView的标准属性(例如,延迟页面控制器中的触摸不起作用,但我认为应该这样做,scrollView
内的scrollView
通常可以正常工作,则可以始终覆盖hitTest方法并用它来决定哪个scrollViews应该接受触摸。只需检查CGPoint
是否在内部滚动视图中,如果是,则返回该scrollView,否则返回您的超级视图。