Swift:为自定义视图添加点击

时间:2017-10-14 05:36:50

标签: ios swift

我想在其他视图的子视图中添加点击,但我的当前方法不会被调用,即当我的座位在handleTap函数中被编码时,我的座位不会被打印。我已根据以下postthis修改了我的方法。到目前为止我的代码:

//My viewController
class ViewController: UIViewController, UIScrollViewDelegate {
    let scrollView = UIScrollView()
    let cinema: CinemaView = {
        let v = CinemaView()
        return v
    }()

    override func viewDidLoad() {
        super.viewDidLoad()

        let seat1 = SeatView()
        seat1.isVacant = false
        seat1.seatNumber = "2A"

        let seat2 = SeatView()
        seat2.isVacant = true
        seat2.seatNumber = "3B"

        cinema.seats = [seat1, seat2]

        let tap = UITapGestureRecognizer(target: seat1, action: #selector(handleTap))
        seat1.addGestureRecognizer(tap)
        seat1.isUserInteractionEnabled = true

        view.addSubview(scrollView)
        scrollView.addSubview(cinema)

    }

    @objc func handleTap(_ seat: SeatView) {
        if let seatNumber = seat.seatNumber {
            print("\(seatNumber) is tapped")
        } else {
            print("Seat tapped")
        }
    }

//My custom cinemaView
class CinemaView: UIView {

    var seats = [SeatView]() {
        didSet {
            for v in self.subviews {
                v.removeFromSuperview()
            }
            var seatRect = CGRect(x: 0, y: 0, width: 20, height: 20)
            for seat in seats {
                self.addSubview(seat)
                seat.frame = seatRect
                seatRect.origin.x += seatRect.size.width + 8
             }
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)

    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

//My Custom seatView
class SeatView: UIView {

    var isVacant: Bool = true 
    var seatNumber: String?

    override init(frame: CGRect) {
        super.init(frame: frame)    
    }
}

注意:上面已经省略了一些样板代码,以使代码简洁明了。

我首选的方法是在VC中添加这些选项,以便我可以将此信息传递到另一个VC并推送到Firebase。任何建议将不胜感激

编辑:添加了UI的截图

enter image description here

1 个答案:

答案 0 :(得分:0)

在3stud1ant3的帮助下,我设法弄清楚哪里出了问题。

观察视图布局后,即使添加了seatViews,电影院也从未添加到视图中。通过在viewController的viewDidLoad中为cinemaView定义更多约束,并在下面的答案文章中加入3stud1ant3的代码,点击功能起作用。

override func viewDidLoad() {
    super.viewDidLoad()

    view.backgroundColor = .blue

    cinema.seats = [seatView1, seatView2]

    view.addSubview(scrollView)
    scrollView.addSubview(cinema)

    let views = ["scrollView": scrollView, "v": cinema] as [String : Any]
    let screenHeight = view.frame.height

    view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|[scrollView(\(screenHeight / 2))]", options: NSLayoutFormatOptions(), metrics: nil, views: views))
    view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[scrollView]|", options: NSLayoutFormatOptions(), metrics: nil, views: views))
    view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[v(50)]", options: NSLayoutFormatOptions(), metrics: nil, views: views))

    //Previously, the below constraints were not added. Once these are added, the tap function works
    cinema.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true
    cinema.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true
    cinema.widthAnchor.constraint(equalTo: scrollView.widthAnchor ,constant: 100).isActive = true

}