iOS Swift 3 - 面板点击后删除覆盖 UIView

Posted

技术标签:

【中文标题】iOS Swift 3 - 面板点击后删除覆盖 UIView【英文标题】:iOS Swift 3 - Remove Overlay UIView after Panel Tap 【发布时间】:2017-05-24 14:48:33 【问题描述】:

我对 swift 很陌生,我被标题中描述的任务困住了。

我的问题:

我正在以编程方式构建一个产品页面,其中包含一些简单的细节和一个报价按钮。点击报价按钮会在视图上显示一个叠加层以及一些其他详细信息。您单击“确定”,覆盖消失。

一切都好,除了覆盖没有消失!

我尝试过的:

func hideOverlay(_ sender: UIButton) 
    containerView.backgroundColor = UIColor.white
    buttonView.backgroundColor = UIColor.white
    for subview in overlayView.subviews 
        subview.removeFromSuperview()
    

在点击overlayView中的按钮时调用函数。我将包括 showOverlay 功能(工作)。

func showOverlay(_ sender: UIButton) 
    //Load overlay view
    let overlayHeight : CGFloat = 500
    let overlayWidth : CGFloat = 290
    let overlayView = UIView(frame: CGRect(x: centreView(masterView: view.frame.width, subView: overlayWidth), y: 64 + centreView(masterView: (view.frame.height - 64), subView: overlayHeight), width: overlayWidth, height: overlayHeight))
    overlayView.backgroundColor = UIColor.white

    let overlayTitle = UILabel(frame: CGRect(x: 0, y: 0, width: overlayWidth, height: overlayHeight*1/5))
    overlayTitle.text = "Offer Taken"
    overlayTitle.font = UIFont.boldSystemFont(ofSize: 35)
    overlayTitle.textAlignment = .center
    overlayView.addSubview(overlayTitle)

    let overlayButtonView = UIView(frame: CGRect(x: 0, y: 0 + (overlayHeight * 4/5), width: overlayWidth, height: overlayHeight * 1/5))
    overlayButtonView.backgroundColor = UIColor.red

    let buttonWidth : CGFloat = 100
    let buttonHeight : CGFloat = 35
    let overlayButton = UIButton(type: UIButtonType.system)
    overlayButton.frame = CGRect(x: centreView(masterView: overlayWidth, subView: buttonWidth), y: overlayButtonView.frame.origin.y + centreView(masterView: overlayButtonView.frame.height, subView: buttonHeight), width: buttonWidth, height: buttonHeight)
    overlayButton.backgroundColor = UIColor.blue
    overlayButton.setTitle("OK",for: .normal)
    overlayButton.setTitleColor(UIColor.white, for: .normal)
    overlayButton.setTitle("Offer Taken", for: .highlighted)
    overlayButton.setTitleColor(UIColor.white, for: .highlighted)
    overlayButton.addTarget(self, action: #selector(self.hideOverlay(_:)), for: .touchUpInside)
    overlayView.addSubview(overlayButtonView)
    overlayView.addSubview(overlayButton)

    containerView.backgroundColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0.5)
    buttonView.backgroundColor = UIColor(colorLiteralRed: 0, green: 0, blue: 0, alpha: 0.5)
    view.addSubview(overlayView)        

我试过了

overlayView.removeFromSuperview()

在 for 循环之后,但我担心 overlayView.subviews 没有正确填充我期望的视图。

感谢任何抽出时间帮助我的人,即使离解决方案更近一点。

【问题讨论】:

您是否检查过您的删除代码是否真的在运行? overlayView 没有子视图。我认为 overlayView.addSubview(blah) 会生成一些子视图,但似乎没有。不过,下面带有标签的答案确实有用,你的时间 【参考方案1】:

func showOverlay(_ sender: UIButton) ... 中,您正在创建一个本地 变量“overlayView”:

let overlayView = UIView(frame: ...)

然后将其作为子视图添加到view。一切都很好,除了您没有保留对“overlayView”的引用......视图仍然存在,但您没有引用它。

在任何功能块之外添加一个类级变量:

var overlayView: UIView!

然后,在 func showOverlay(_ sender: UIButton) ... 内部,而不是 let overlayView =,只需将其分配给现有变量:

overlayView = UIView(frame: ...)

当您准备好删除它时:

func hideOverlay(_ sender: UIButton) 
    overlayView.removeFromSuperview()

你就完成了:)

【讨论】:

这就是我要找的,谢谢。我已经分配了一个类变量(我认为至少)做 var overlayView = UIView()。但后来我想我已经通过 let overlayView = UIView(frame: ...)? 覆盖了它?我在这里做了调整,效果很好 正是...无论何时您使用letvar,您都在创建一个 变量。如果您在“较低范围”中这样做 - 例如在函数中 - 将使用 new 变量而不是较高范围的变量。很高兴你让它工作:)【参考方案2】:

尝试此处类似线程中描述的viewWithTag 方法:

Swift addsubview and remove it

【讨论】:

成功了,感谢您为我指明了正确的方向!

以上是关于iOS Swift 3 - 面板点击后删除覆盖 UIView的主要内容,如果未能解决你的问题,请参考以下文章

mac 怎么格式化u盘 guid分区

Firestore 覆盖 iOS Swift 中已存在的数据

IOS Swift3卡栈覆盖

怎样彻底删除电脑里所有的Flash文件

电脑上怎么彻底卸载软件

电脑账户怎么注册?