尝试在以编程方式swift 3创建的视图中单击时出错

时间:2017-08-03 13:29:35

标签: ios swift3 uigesturerecognizer

我以编程方式创建了一个视图,就像一个来自顶部的弹出窗口,里面有一些文字和图像!

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

4 个答案:

答案 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")输出到调试控制台。

我没有进一步挖掘,所以我不知道你是否需要放置额外的代码来将帧高重置为零(或者它可能被隐藏或移除,无论如何)。