我试图理解为什么我的子视图没有接收到触摸。
下面是一个显示我遇到的行为的gif:当我点击右边的青色按钮时,没有任何反应(左边视图的背景应该改变颜色)。当我单击左侧的绿色按钮时,它会正确接收触摸事件,附加的TouchDown操作将触发,并且视图的颜色会发生变化。
这个“应用程序”显然不是一个真正的应用程序,只是为了说明我遇到的行为。我真正想要学习如何实现你在许多应用程序中看到的常见“滑出菜单”模式;通常带有随附的汉堡包按钮。
在许多这些应用程序中,看起来主要的应用程序内容被移到一边显示菜单,“隐藏”在应用程序下面,就像它一样。我试图在这里复制相同的行为。
我在这里粘贴了我的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()
}
}
}
答案 0 :(得分:12)
containerView
是view
的子视图,但containerView
的原点位于其父视图(view
)的右边缘,因为该行:
containerView.frame = CGRectMake(self.view.frame.width, originalY, 150, self.view.frame.height)
子视图在superview
范围之外的任何部分都不会收到触摸事件。触摸事件只会传递并通过子视图中 超视图范围内的部分进行识别。这就是您点击青色按钮时不会“触发”的原因。
解决问题的一种方法是使用辅助子视图(称之为view
)覆盖并覆盖overlayView
,并操纵其框架,而不是操纵containerView
的框架。 。确保两个视图中至少有一部分位于主视图的范围内,以便它们可以接收触摸事件。