如何在UIScrollView中同时执行UIScrollView

时间:2017-03-21 15:06:59

标签: ios swift uiscrollview uipangesturerecognizer

我正在使用启用了分页的UIScrollView( UIScrollView_1 ),可以水平移动3页。
在最后一页上有多个UIScrollViews(每个都在它自己的单元格中)( UIScrollView_2 ),当水平向右滚动(向前)时显示最后一页(相应地加载到滚动的单元格) )。
但是如果向左(向后)滚动,我希望UIScrollView_1接管并向后滚动 如果我向上移动手指并注册新的触摸事件,这将按预期工作。但是我希望它在同一个平底锅上同时在UIScrollViews之间起作用。

|-------------UIScrollView_1----------|    
| Page_1 | Page_2 |--UIScrollView_2---|  
..................|...Page_3|Page_4...|

我想要的是在UIGestureRecognizerDelegate中使用shouldRecognizeSimultaneouslyWith。
但是当我尝试将UIScrollViews委托给同一个ViewController时,错误 'UIScrollView的内置平移手势识别器必须将其滚动视图作为其委托。' 显示在ScrollView_2上。

关于如何解决这个问题的任何想法?

更新

这是来自page_3的UIViewController的cellForRow,它不会导致委托错误,但是UIScrollViews不会同时执行。 (例如,需要上下移动手指以检测其他UIScrollView。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "random", for: indexPath)
    return cell
}

这是导致 '的cellForRow.UIScrollView的内置平移手势识别器必须将其滚动视图作为其委托。' - 错误

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

    let cell = tableView.dequeueReusableCell(withIdentifier: "random", for: indexPath)

    let scrollView_1_VC = self.parent
    cell.scrollView_2.panGestureRecognizer.delegate = scrollView_1_VC

    return cell
}

2 个答案:

答案 0 :(得分:1)

我解决了。
必须将UIScrollView的内置UIPanGestureRecognizer委托给它自己的UIScrollView,因为错误 'UIScrollView的内置平移手势识别器必须将其滚动视图作为其委托。' 表示。
而是继承UIScrollView并创建第二个UIPanGestureRecognizer,然后与内置的UIPanGestureRecognizer同时执行。

步骤1 - 4:

  1. 对单元格的UIScrollView进行子类化并创建第二个UIPanGestureRecognizer。

  2. 将UIGestureRecognizerDelegate添加到CellScrollView并使shouldRecognizeSimultaneouslyWith返回true。
    第二个UIPanGestureRecognizer现在将与内置的UIPanGestureRecognizer同时执行。

    类CellScrollView:UIScrollView,UIGestureRecognizerDelegate {

     var panGesture : UIPanGestureRecognizer!
    
     override func awakeFromNib() {
         panGesture = UIPanGestureRecognizer.init(target: self, action: nil)
         addGestureRecognizer(panGesture)
     }
    
     func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
         return true
     }
    

    }

  3. 在cellForRow中,将新创建的UIPanGestureRecognizer委托给UIScrollView_1的UIViewController。

    func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) - > UITableViewCell {

    if medicines.isEmpty {
        return tableView.dequeueReusableCell(withIdentifier: "emptyMedCell", for: indexPath)
    }
    let cell = tableView.dequeueReusableCell(withIdentifier: "random", for: indexPath)
    let scrollView_1_VC = self.parent
    cell.cellScrollView.panGesture.delegate = scrollView_1_VC
    return cell
    

    }

  4. 最后,在ScrollView_1的UIViewController中,让shouldRecognizeSimultaneouslyWith返回true。

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return true
    

    }

答案 1 :(得分:0)

我想你想要使用像

这样的东西
func gestureRecognizer(UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer:UIGestureRecognizer) -> Bool {
    if page3 {
        return true
    }
}

在ScrollView_2的UIViewController上,让ScrollView_2(不是手势)代表作为ViewController,

ScrollView_2.delegate = self
UIPanGesture.delegate = ScrollView_2