滚动视图子视图关闭时,手势识别器无法正常工作

时间:2017-02-27 16:02:11

标签: ios swift uiscrollview uitapgesturerecognizer

我的视图控制器中有一个UIScrollView,其中UIView(称为viewPreSeasonCard)充当内容视图,所有操作都在Interface Builder中完成。然后我以编程方式将子视图添加到容器中,如下所示:

func displayPreSeason(preSeasons: [PreSeason]) {
    var yPos = 0
    let viewWidth = Int(viewPreSeasonCard.frame.width)
    for (index, preSeason) in preSeasons.enumerated() {
        yPos = 40 + index * 80
        let frame = CGRect(x: 0, y: yPos, width: viewWidth, height: 78)
        let preSeasonView = PreSeasonLineupView(frame: frame)
        preSeasonView.setPreSeason(preSeason: preSeason)
        preSeasonView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(self.preSeasonClicked)))

        viewPreSeasonCard.frame.size.height += frame.height
        viewPreSeasonCard.addSubview(preSeasonView)
    }

    let curSize = self.view.frame
    scrollView.contentSize = CGSize(width: curSize.width, height: curSize.height + CGFloat(yPos))
}

如您所见,我在添加子视图后调整scrollView.contentSize。这一切都正常,我可以向下滚动滚动视图,看到所有的子视图。

问题在于UITapGestureRecognizer我要添加到子视图中。当子视图最初在设备屏幕上可见时(即前3或4个子视图),手势识别器正在工作。但是当我必须滚动查看子视图时,这些子视图上的手势识别器在我点击它们时根本不会触发。就好像因为较低的子视图最初不可见,手势识别器会被忽略。

以下是手势识别器的方法:

func preSeasonClicked(_ sender: UITapGestureRecognizer) {
    if let preSeasonView = gestureRecognizer.view as? PreSeasonLineupView, let constructorId = preSeasonView.constructorId {
        presenter.preSeasonClicked(constructorId: constructorId)
    }
}

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我在Scroll View中有ContentView

问题我发现ContentView我将其高度设置为等于ScrollView父视图。我正在计算我自己的ScrollView的ContentSize。

所以行为是滚动视图正确滚动但是在ViewController的第一次显示中任何视图都是OFF屏幕都无法检测到触摸。

经过一些调试后,我试图让ContentT的ClipToBounds成为现实。我看到了我在等什么,内容视图只是屏幕的高度(ScrollView父级)

我删除了使内容视图等于scrollview parent的高度的约束。 而不是添加新的约束来将容器视图的底部与底部的大多数视图的底部对齐,并且不再计算内容大小。

目前滚动工作正常,触控适用于所有视图。

答案 1 :(得分:0)

我对内容视图有同样的问题,我对高度没有限制。

我最终做的是完全删除内容视图并修复了问题。

希望有所帮助!