我遇到的问题是控件根本没有响应视图/窗口的某个部分。在我的情况下,这是底部。
我正在做的是展示一个新窗口,它有一个纵向的根视图控制器。如果应用程序支持纵向方向,这一切似乎都可以正常工作。但是当应用程序只是横向时,窗口的底部部分没有响应。
(在开始评论之前,我应该锁定视图控制器方向并允许所有应用程序方向让我告诉你它是一个框架,我无法访问应用程序方向。是的,它是一个要求以肖像显示)
很自然地,我通过覆盖窗口命中测试尝试了一个快速的技巧,但结果令人惊讶地已经正确。对supper的调用将返回正确的视图,在下面的示例中,它将实际返回按下的按钮本身,但目标方法不会触发。所以必须有其他东西破坏管道。
示例控制器(您可以复制它并简单地调用静态方法showOverlay
):
class OverlayViewController: UIViewController {
class MyWindow: UIWindow {
override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? {
let toReturn: UIView? = super.hitTest(point, withEvent: event)
print(toReturn)
return toReturn;
}
}
var myWindow: UIWindow?
internal static func showOverlay() {
let window = MyWindow(frame: fullScreenFrame())
let controller = OverlayViewController()
window.rootViewController = controller
window.windowLevel = UIWindowLevelStatusBar
window.makeKeyAndVisible()
window.backgroundColor = UIColor.grayColor()
controller.myWindow = window
var y = 10.0
while y<2000.0 {
let view = controller.view
let btn = UIButton(frame: CGRect(x: 10.0, y: y, width: 120.0, height: 10.0))
view.addSubview(btn)
btn.addTarget(controller, action: "close:", forControlEvents: .TouchUpInside)
btn.backgroundColor = UIColor(white: CGFloat(y/2000.0), alpha: 1.0)
y += 10.0
}
}
func close(button: UIButton) {
print("Did press \(button.frame.origin.y)")
}
internal static func fullScreenFrame() -> CGRect {
return CGRect(x: 0.0,
y: 0.0,
width: (UIInterfaceOrientationIsPortrait(UIApplication.sharedApplication().statusBarOrientation) ? UIScreen.mainScreen().bounds.size.width : UIScreen.mainScreen().bounds.size.height),
height: (UIInterfaceOrientationIsPortrait(UIApplication.sharedApplication().statusBarOrientation) ? UIScreen.mainScreen().bounds.size.height : UIScreen.mainScreen().bounds.size.width))
}
override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
return UIInterfaceOrientationMask.Portrait
}
override func preferredInterfaceOrientationForPresentation() -> UIInterfaceOrientation {
return UIInterfaceOrientation.Portrait
}
override func shouldAutorotate() -> Bool {
return false
}
}
再次重现此问题,您需要禁用plist中的纵向支持。
当您按下任何按钮时,它将记录hitTest方法中的按钮。但只有顶部按钮才会实际调用其目标方法close
。
我能想到的解决方法是支持所有方向并通过应用变换手动旋转视图。但我更愿意保留窗口系统,如果可能的话,因为覆盖并继续测试所有方向,处理动画等等是一种痛苦......
感谢您的帮助。