我的 View Controller 中有一个 UIScrollView ,其中有一个 UIView (称为 viewPreSeasonCard )作为内容 View ,全部在界面生成器。然后我以编程方式将 subview 添加到容器中,如下所示:
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))
}
如您所见,我在添加 subview 后调整 scrollView.contentSize 。这一切正常,我可以一直向下滚动 ScrollView 并查看所有 subview 。
问题在于我要添加到 subview 中的 UITapGestureRecognizer 。当 subview 最初在设备屏幕上可见时(即前 3 或 4 个 subview ),手势识别器正在工作。但是当我必须滚动查看 subview 时,当我点击它们时,这些 subview 上的手势识别器根本不会触发。好像是因为最初看不到较低的 subview ,所以忽略了手势识别器。
手势识别器的方法如下:
func preSeasonClicked(_ sender: UITapGestureRecognizer) {
if let preSeasonView = gestureRecognizer.view as? PreSeasonLineupView, let constructorId = preSeasonView.constructorId {
presenter.preSeasonClicked(constructorId: constructorId)
}
}
Best Answer-推荐答案 strong>
我有同样的问题,我在 ScrollView 中有 ContentView
我发现的问题是我设置的 ContentView 其高度等于 ScrollView 父 View 。我正在计算自己的 ScrollView 的 ContentSize。
所以行为是 ScrollView 正确滚动,但任何 View 在 ViewController 的第一次显示中都处于关闭屏幕无法检测到触摸。
经过一些调试后,我尝试使 ClipToBounds 对 ContentView 是正确的。我看到了我在等待的内容,内容 View 只有屏幕的高度(ScrollView 父级)
我删除了使内容 View 等于 ScrollView 父级高度的约束。
而不是添加了新的约束来将容器 View 的底部与底部大多数 View 的底部对齐,并且不再计算内容大小。
目前滚动工作正常,触摸适用于所有 View 。
关于ios - 当 ScrollView subview 不在屏幕上时,手势识别器不起作用,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/42490279/
|