В чем разница между point и hitTest и как я могу использовать hitTest? - PullRequest
0 голосов
/ 03 марта 2019

Я хочу добавить область прикосновения к моему scrollView, и у меня есть scrollView внутри контейнера.страница scrollView меньше этого контейнера.Я много нахожу в Интернете, как это использовать в Swift 4.2, но никто не объясняет, как использовать шаг за шагом HitTest.Что я делаю, когда делаю подкласс типа UIView?Как использовать этот класс после того, как в классе, который имеет scroolView или containerView?

Спасибо.

Это код.

import UIKit

struct scrollViewDataStruct {
    let title: String?
    let image: UIImage?
}

class PaymentsOptionsController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var scrollView: UIScrollView!
    var scrollViewData = [scrollViewDataStruct]()

    override func viewDidLoad() {
    super.viewDidLoad()
    self.scrollView.delegate = self

    scrollViewData = [scrollViewDataStruct.init(title: "First", image:  #imageLiteral(resourceName: "amex")),scrollViewDataStruct.init(title: "Second", image:  #imageLiteral(resourceName: "chase-debit-card_front")),scrollViewDataStruct.init(title: "Third", image:  #imageLiteral(resourceName: "amex"))]
    scrollView.contentSize.width = self.scrollView.frame.width * (CGFloat(scrollViewData.count) + 1)
    var i: CGFloat = 0
    var j: CGFloat = 1
    let halfInterSpacing: CGFloat = 10.5
    let viewWidth : CGFloat = 305
    let viewOptions = PaymentMenuViewController(frame: CGRect(x: (halfInterSpacing * j) + viewWidth * i, y: 0, width :  viewWidth, height: self.scrollView.frame.height))
    self.scrollView.addSubview(viewOptions)
    i += 1
    j += 2
    for data in scrollViewData{
        let view = CustomView(frame: CGRect(x: (halfInterSpacing * j) + viewWidth * i, y: 0, width :  viewWidth, height: self.scrollView.frame.height))
        view.imageView.image = data.image
        self.scrollView.addSubview(view)

        i += 1
        j += 2
    }
    self.scrollView.clipsToBounds = false
    }


    class CustomView: UIView {   
        let imageView : UIImageView = {
        let imageView = UIImageView()
        imageView.translatesAutoresizingMaskIntoConstraints = false
        imageView.backgroundColor = UIColor.white
        imageView.contentMode = .scaleAspectFit
        return imageView
        }()

        override init(frame: CGRect) {
            super.init(frame: frame)
            self.addSubview(imageView)
            imageView.leftAnchor.constraint(equalTo: self.leftAnchor).isActive = true
            imageView.rightAnchor.constraint(equalTo: self.rightAnchor).isActive = true
            imageView.topAnchor.constraint(equalTo: self.topAnchor).isActive = true
            imageView.bottomAnchor.constraint(equalTo: self.bottomAnchor).isActive = true
        }

        required init?(coder aDecoder: NSCoder) {
             fatalError("aaa")
        }
    }   
}


class PassThruScrollView: UIScrollView {

    var passThruViewRef: UIView?

    override func point(inside point: CGPoint, with event: UIEvent?) -> Bool    {

    return point.y > passThruViewRef?.frame.height ?? 0

    }

}

Изображение с моей доски

1 Ответ

0 голосов
/ 03 марта 2019

Если вы хотите, чтобы hitTest для вида прокрутки распознавал жесты за пределами вида прокрутки, вам нужно преобразовать координату в систему координат текущего вида:

class CustomScrollView: UIScrollView {
    var referenceView: UIView?   // if you leave this `nil`, it will assume `superview`

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        let view = referenceView ?? superview!

        let frame = convert(view.bounds, from: view)
        return frame.contains(point) ? self : nil
    }
}

FWIW, это прекрасно работает на устройстве, но странно ведет себя на симуляторе, поэтому используйте на свой страх и риск.

Но ниже я прокрутил, делая жесты в серой области, вне вида прокрутки:

enter image description here

...