我以编程方式创建了一个视图,就像一个来自顶部的弹出窗口,里面有一些文字和图像!
alert = UIView(frame: CGRect(x: 0, y: 0, width: self.frame.width , height: 0))
alert?.frame.origin.y = (textLable?.frame.height)!
alert?.frame.size.height = (textLable?.frame.height)!
alert?.backgroundColor = self.arrayOptions.colorBackground
然后我尝试在init中调用的setup func中将UITapGestureRecognizer添加到该视图中。
let tap = UITapGestureRecognizer(target: self, action: #selector(self.teste))
tap.numberOfTapsRequired = 1
alert?.addGestureRecognizer(tap)
我在UitableViewController中添加这样的视图:
self.popView = PopupView(frame: CGRect(x: 0 , y: 0 , width:self.view.frame.width, height: 0), with: PopUpOptions.error, originY: 0,description:"blablabla")
self.view.addSubview(self.popView!)
但是当我点击视图时没有任何反应,但是当我反复点击时会发生这种错误:
< _UISystemGestureGateGestureRecognizer:0x174186f50>:手势:失败 在下次触摸之前接收系统手势状态通知
但我似乎无法找到答案,任何人都可以帮助我! 谢谢!
这是我的框架的GitHub链接https://github.com/Coimbraa/AlertsPopup_framework
答案 0 :(得分:0)
试试这个:
alert.isUserInteractionEnabled = true
为要点击的视图(添加点击手势识别器的位置)将此属性设置为true
。
答案 1 :(得分:0)
您正在表视图控制器中添加自定义警报视图。
首先尝试Tung Fam所建议的,如果它不起作用,
尝试在窗口上添加它:
self.view.window.addSubview(self.popView!)
还将窗口框架设置为popupView。
答案 2 :(得分:0)
我看到你正在为TapGesture设定目标
let tap = UITapGestureRecognizer(target: self, action: #selector(self.teste))
此处self
是UIView的对象(您的警报视图)。
因此,根据此行,您的tapGesture侦听器必须在alert?
类中实现。并且您需要使用自定义协议或自定义委托来获取tapGesture在其他类中的操作。
答案 3 :(得分:0)
看看你的GitHub回购 - 情侣笔记......
我在您的代码中看到了很多" !" 。其中每一个都是潜在的崩溃。例如,我必须进行一些编辑才能让它完全运行(我没有代码所期望的图像资源)。
在PopUpView.swift
中将init()
func更改为此(仅添加了clipsToBounds
行):
override public init(frame: CGRect) {
super.init(frame: frame)
setup()
self.clipsToBounds = true
}
现在,当您致电popView?.toggleStatus()
时,您可能无法看到 任何内容 。
你的PopupView"容器"高度为零。如果不剪切其内容,您查看内容,但无法与其进行互动。
我将toggleStatus()
中的动画块更改为:
UIView.animate(withDuration: 0.5, animations: {
if let sz = self.alert?.frame.size {
self.frame.size.height = sz.height
}
self.alert?.frame.origin.y = (self.startY)! + (self.status ? 0 : -((self.textLable?.frame.height)! + self.startY))
}) { (finished:Bool) in
// ...
我现在可以点击并编辑TextView,然后点击其他地方并将print("pressed")
输出到调试控制台。
我没有进一步挖掘,所以我不知道你是否需要放置额外的代码来将帧高重置为零(或者它可能被隐藏或移除,无论如何)。