UITapGestureRecognizer在属于另一个控制器的视图中不起作用

时间:2017-05-22 16:37:15

标签: ios swift view uitapgesturerecognizer

 @IBAction func popView(_ sender: UIButton) {
    let popView = PopView()
    popView.setVisible()
    popView.animateView(view: popView.contentView)

}

popView是一个viewcontroller,里面有一些视图,popView在其init()中使用setup()来设置这些视图。

    func setup(){
    view.frame = UIScreen.main.bounds

    baseView.frame = view.frame
    baseView.backgroundColor = UIColor.black
    //baseView.alpha = appearence.backgroundAlpha
    view.addSubview(baseView)

    contentView.backgroundColor = UIColor.white
    contentView.layer.cornerRadius = appearence.cornerRadius
    contentView.frame = CGRect(x: 10, y: 10, width: appearence.width, height: appearence.height)
    contentView.layer.masksToBounds = true
    contentView.center = CGPoint(x: self.view.bounds.midX , y: self.view.bounds.midY )


    baseView.addSubview(contentView)

    headView.frame = CGRect(x: 0, y: 0, width: contentView.bounds.width, height: contentView.bounds.height / 2)
    headView.backgroundColor = UIColorFromRGB(0xE64D4D)
    contentView.addSubview(headView)



    headImageView.image = UIImage(named: headImage)
    headImageView.contentMode = .center
    headImageView.frame.size = headImageView.image!.size
    headImageView.center = CGPoint(x: headView.bounds.midX, y: headView.bounds.midY)
    headView.addSubview(headImageView)



    let recognizer = UITapGestureRecognizer(target: self, action: #selector(self.hide(_: )))
    recognizer.numberOfTapsRequired = 1
    contentView.addGestureRecognizer(recognizer)
    print(String(describing: contentView.gestureRecognizers))
} 

contentView有一个tapgesturerecognizer,但当我点击它时,它没有工作

func hide(_ recognizer: UITapGestureRecognizer){
    self.view.removeFromSuperview()
}

popView是由ViewController类

中的代码创建的
 @IBAction func popView(_ sender: UIButton) {
    let popView = PopView()
    popView.setVisible()
    popView.animateView(view: popView.contentView)

}

func setVisible(){
    let rootView = UIApplication.shared.keyWindow! as UIWindow
    rootView.addSubview(self.view)

}

func animateView(view: UIView){
    view.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.minY - view.bounds.midY)
    UIView.animate(withDuration: 0.2, animations: {
        view.center = CGPoint(x: self.view.bounds.midX , y: self.view.bounds.midY + 50)
    }, completion: {(finished) -> Void in
        UIView.animate(withDuration: 0.1, animations: {
            view.center = CGPoint(x: self.view.bounds.midX , y: self.view.bounds.midY )

        })


    })
}

popView正确显示,但contentView没有响应点按手势。为什么?请帮帮我〜

1 个答案:

答案 0 :(得分:0)

在popView的视图控制器而不是内容视图上添加点按手势。它将如下工作。

let recognizer = UITapGestureRecognizer(target: self, action: #selector(self.hide(_: )))
        recognizer.numberOfTapsRequired = 1
        popView.view.addGestureRecognizer(recognizer)
        print(String(describing: popView.view.gestureRecognizers))

同时将隐藏功能移动到按钮动作类中。请隐藏并显示到该类本身,如下所示。

func hide(_ recognizer: UITapGestureRecognizer){
        self.popView.view.removeFromSuperview()

        let rootView = UIApplication.shared.keyWindow! as UIWindow
        rootView.addSubview(self.view)


    }

我希望这会有所帮助。

以下是我的PopView类代码:

import UIKit

class PopView: UIViewController {

    var baseView: UIView = UIView()
    var contentView: UIView = UIView()
    var headView: UIView = UIView()
    var headImageView: UIImageView = UIImageView()


    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.setup()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func setup(){
        view.frame = UIScreen.main.bounds

        baseView.frame = view.frame
        baseView.backgroundColor = UIColor.black
        //baseView.alpha = appearence.backgroundAlpha
        view.addSubview(baseView)

        contentView.backgroundColor = UIColor.white
        contentView.layer.cornerRadius = 0.5
        contentView.frame = CGRect(x: 10, y: 10, width: 200, height: 200)
        contentView.layer.masksToBounds = true
        contentView.center = CGPoint(x: self.view.bounds.midX , y: self.view.bounds.midY )


        baseView.addSubview(contentView)

        headView.frame = CGRect(x: 0, y: 0, width: contentView.bounds.width, height: contentView.bounds.height / 2)
        headView.backgroundColor = UIColor.yellow
        contentView.addSubview(headView)



        headImageView.image = UIImage(named: "patternsPlaceholder")
        headImageView.contentMode = .center
        headImageView.frame.size = headImageView.image!.size
        headImageView.center = CGPoint(x: headView.bounds.midX, y: headView.bounds.midY)
        headView.addSubview(headImageView)

    }

    func setVisible(){
        let rootView = UIApplication.shared.keyWindow! as UIWindow
        rootView.addSubview(self.view)

    }

    func animateView(view: UIView){
        view.center = CGPoint(x: self.view.bounds.midX, y: self.view.bounds.minY - view.bounds.midY)
        UIView.animate(withDuration: 0.2, animations: {
            view.center = CGPoint(x: self.view.bounds.midX , y: self.view.bounds.midY + 50)
        }, completion: {(finished) -> Void in
            UIView.animate(withDuration: 0.1, animations: {
                view.center = CGPoint(x: self.view.bounds.midX , y: self.view.bounds.midY )

            })


        })
    }



    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}

以下是我的baseviewController代码。

import UIKit

class ViewController: UIViewController {

    var popView = PopView()

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    @IBAction func popViewButtonAction(_ sender: Any) {

//        let popView = PopView()
        popView.setVisible()
        popView.animateView(view: popView.contentView)

        let recognizer = UITapGestureRecognizer(target: self, action: #selector(self.hide(_: )))
        recognizer.numberOfTapsRequired = 1
        popView.view.addGestureRecognizer(recognizer)
        print(String(describing: popView.view.gestureRecognizers))

    }

    func hide(_ recognizer: UITapGestureRecognizer){
        self.popView.view.removeFromSuperview()

        let rootView = UIApplication.shared.keyWindow! as UIWindow
        rootView.addSubview(self.view)


    }



}

我希望它会给你一个想法。

谢谢, 尚卡尔