[英]Gesture recognizer not working when scrollview subview is off screen
我的視圖控制器中有一個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
,添加子視圖后,我將調整scrollView.contentSize
。 這一切都可以正常工作,我可以將scrollview一直向下滾動並查看所有子視圖。
問題是我要添加到子視圖的UITapGestureRecognizer
。 當子視圖最初在設備屏幕上可見時(即前3或4個子視圖),手勢識別器正在工作。 但是當我不得不滾動查看子視圖時,當我點擊它們時,這些子視圖上的手勢識別器根本不會觸發。 好像是因為較低的子視圖最初不可見,所以手勢識別器將被忽略。
這是手勢識別器的方法:
func preSeasonClicked(_ sender: UITapGestureRecognizer) {
if let preSeasonView = gestureRecognizer.view as? PreSeasonLineupView, let constructorId = preSeasonView.constructorId {
presenter.preSeasonClicked(constructorId: constructorId)
}
}
我有同樣的問題,並且在滾動視圖中有ContentView
我發現的問題是,我將ContentView設置為與ScrollView父視圖相等的高度。 我正在自己計算ScrollView的ContentSize。
因此,行為是滾動視圖正確滾動,但是ViewController的第一個節目中的任何視圖都處於OFF屏幕無法檢測到觸摸。
經過一些調試后,我嘗試使ClipToBounds對於ContentView為true。 並且我看到了我在等待的內容視圖僅具有屏幕的高度(ScrollView父級)
我刪除了使內容視圖與scrollview父級高度相等的約束。 然后添加了新的約束,以將容器視圖的底部與底部的大多數視圖的底部對齊,並且不再計算內容大小。
當前,滾動正常工作,並且觸摸對於所有視圖均有效。
我對內容視圖也有同樣的問題,但對高度沒有任何限制。
我最終要做的是完全刪除內容視圖,從而解決了該問題。
希望有幫助!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.