SWIFT UIPanGestureRecognizer 第一次失败

问题描述

我的测试应用有 4 个 ScrollView。

  1. 可以向上/向下滚动的UIScrollView。
  2. UIPageViewController 在 1 里面,可以左右滚动。
  3. viewController 2 之一中的 UITableView,可以向上/向下滚动。
  4. tableView 3 上的 UITableViewCell 内的 UIScrollView,可以向左/向右滚动。

https://i.stack.imgur.com/BexX3.jpg

UIScrollView 4 的第一次滑动手势会导致 PageViewController 2 滚动。第二次和更多次滑动工作正常。

UIScrollView 4 的 PanGestureRecognizer 在第一次滑动时状态为“失败”。 <UIScrollViewPanGestureRecognizer: 0x7f826881fd50; state = Failed; delaystouchesEnded = NO; view = <Tests.MyCellScroll 0x7f826802f600>; target= <(action=handlePan:,target=<Tests.MyCellScroll 0x7f826802f600>)>>

任何想法是什么问题或如何调试?

示例

class ViewController: UIViewController {
    
    private let vcs: [UIViewController] = [
        MyVC(),UIViewController()
    ]
    
    private lazy var scroll: UIScrollView = {
        let scroll = UIScrollView()
        scroll.backgroundColor = .systemPink
        return scroll
    }()
    
    private lazy var pageVC: UIPageViewController = {
        let page = UIPageViewController(transitionStyle: .scroll,navigationorientation: .horizontal,options: nil)
        page.view.backgroundColor = .white
        page.delegate = self
        page.dataSource = self
        return page
    }()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.view.addSubview(self.scroll)
        
        self.addChild(self.pageVC)
        self.scroll.addSubview(self.pageVC.view)
        self.pageVC.didMove(toParent: self)
        
        self.pageVC.setViewControllers([self.vcs[0]],direction: .forward,animated: true,completion: nil)
    }
    
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        self.scroll.frame = self.view.frame
        self.scroll.contentSize = CGSize(width: self.view.frame.width,height: self.view.frame.height + 50)
        self.pageVC.view.frame  = CGRect(x: self.scroll.bounds.minX,y: self.scroll.bounds.minY + 250,width: self.scroll.bounds.width,height: self.scroll.contentSize.height - 250)
    }
}

extension ViewController: UIPageViewControllerDataSource,UIPageViewControllerDelegate {
    func pageViewController(_ pageViewController: UIPageViewController,viewControllerBefore viewController: UIViewController) -> UIViewController? {
        self.vcs.firstIndex(of: viewController) == 1 ? self.vcs[0] : nil
    }
    
    func pageViewController(_ pageViewController: UIPageViewController,viewControllerAfter viewController: UIViewController) -> UIViewController? {
        self.vcs.firstIndex(of: viewController) == 0 ? self.vcs[1] : nil
    }
}

final class MyVC: UIViewController {
    private lazy var table: UITableView = {
        let table = UITableView()
        table.register(MyCell.self,forCellReuseIdentifier: String(describing: MyCell.self))
        table.delegate = self
        table.dataSource = self
        return table
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.addSubview(self.table)
    }
    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        self.table.frame = self.view.frame
    }
}

extension MyVC: UITableViewDelegate,UITableViewDataSource {
    func tableView(_ tableView: UITableView,numberOfRowsInSection section: Int) -> Int { 5 }
    func tableView(_ tableView: UITableView,cellForRowAt indexPath: IndexPath) -> UITableViewCell { MyCell() }
}

final class MyCell: UITableViewCell {
    
    private lazy var subview: UIView = {
        let view = UIView()
        view.backgroundColor = UIColor.systemBlue.withAlphaComponent(0.7)
        return view
    }()
    
    private lazy var scrollView: MyCellScroll = {
        let view = MyCellScroll()
        return view
    }()
    
    init(){
        super.init(style: .default,reuseIdentifier: nil)
        self.contentView.backgroundColor = UIColor.systemOrange.withAlphaComponent(0.7)
        self.contentView.addSubview(self.scrollView)
        self.scrollView.addSubview(self.subview)
    }
    
    override func layoutSubviews() {
        super.layoutSubviews()
        let frame = self.contentView.frame
        
        self.scrollView.frame = frame
        self.scrollView.contentSize = CGSize(width: 500,height: frame.height)
        
        self.subview.frame = CGRect(x: 16,y: 8,width: 500 - 32,height: frame.height - 16)
    }
    
    required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}


final class MyCellScroll: UIScrollView,UIGestureRecognizerDelegate {
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        print(gestureRecognizer)
        return false // 5
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)