簡體   English   中英

當滾動視圖子視圖不在屏幕上時,手勢識別器不起作用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM