UIView子视图未接收到触摸

时间:2015-08-16 04:22:45

标签: ios swift uiview

我试图理解为什么我的子视图没有接收到触摸。

下面是一个显示我遇到的行为的gif:当我点击右边的青色按钮时,没有任何反应(左边视图的背景应该改变颜色)。当我单击左侧的绿色按钮时,它会正确接收触摸事件,附加的TouchDown操作将触发,并且视图的颜色会发生变化。

enter image description here

这个“应用程序”显然不是一个真正的应用程序,只是为了说明我遇到的行为。我真正想要学习如何实现你在许多应用程序中看到的常见“滑出菜单”模式;通常带有随附的汉堡包按钮。

在许多这些应用程序中,看起来主要的应用程序内容被移到一边显示菜单,“隐藏”在应用程序下面,就像它一样。我试图在这里复制相同的行为。

我在这里粘贴了我的ViewController代码。您在下面看到的代码就是我拥有的一切。

import UIKit

class ViewController: UIViewController {

    var originalX : CGFloat!
    var originalY : CGFloat!

    var containerView = UIView()

    var button : UIButton!
    var button2 : UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()

        originalX      = self.view.frame.origin.x
        originalY      = self.view.frame.origin.y

        button = UIButton(frame: CGRectMake(200, 25, 100, 100))
        button.backgroundColor = UIColor.greenColor()
        button.addTarget(self, action: "foo", forControlEvents: .TouchDown)

        view.addSubview(button)

        containerView.frame = CGRectMake(self.view.frame.width, originalY, 150, self.view.frame.height)
        containerView.userInteractionEnabled = true
        containerView.backgroundColor = UIColor.magentaColor()
        containerView.clipsToBounds = false

        button2 = UIButton(frame: CGRectMake(25, 25, 100, 100))
        button2.backgroundColor = UIColor.cyanColor()
        button2.addTarget(self, action: "bar", forControlEvents: .TouchDown)

        view.addSubview(containerView)
        containerView.addSubview(button2)
    }

    @IBAction func left() {
        UIView.animateWithDuration(0.3) {
            self.view.frame = CGRectMake(self.originalX - 150, self.originalY, self.view.frame.width, self.view.frame.height)
        }
    }

    @IBAction func right() {
        UIView.animateWithDuration(0.3) {
            self.view.frame = CGRectMake(self.originalX, self.originalY, self.view.frame.width, self.view.frame.height)
        }
    }

    func foo() {
        UIView.animateWithDuration(1.0) {
            self.view.backgroundColor = UIColor.redColor()
        }
    }

    func bar() {
        UIView.animateWithDuration(1.0) {
            self.view.backgroundColor = UIColor.blueColor()
        }
    }

}

1 个答案:

答案 0 :(得分:12)

containerViewview的子视图,但containerView的原点位于其父视图(view)的右边缘,因为该行:

containerView.frame = CGRectMake(self.view.frame.width, originalY, 150, self.view.frame.height)

子视图在superview范围之外的任何部分都不会收到触摸事件。触摸事件只会传递并通过子视图中 超视图范围内的部分进行识别。这就是您点击青色按钮时不会“触发”的原因。

解决问题的一种方法是使用辅助子视图(称之为view)覆盖并覆盖overlayView,并操纵其框架,而不是操纵containerView的框架。 。确保两个视图中至少有一部分位于主视图的范围内,以便它们可以接收触摸事件。