ios - 除非我指定正确的 CGRect,否则 UIView 上的按钮没有响应

标签 ios swift uiview

我正在尝试实现一个简单的 UIView,当互联网连接丢失时,它会显示在屏幕底部,并且会有一个关闭按钮。我的 UIView 类看起来像这样。

import UIKit

class ConnectionLostAlertUIView: UIView {

    @IBOutlet var view: UIView!
    var viewConstraints: [NSLayoutConstraint] = []

    override init(frame: CGRect) {
        super.init(frame: frame)
        Bundle.main.loadNibNamed("ConnectionLostAlertView", owner: self, options: nil)
        self.addSubview(self.view)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        Bundle.main.loadNibNamed("ConnectionLostAlertView", owner: self, options: nil)
        self.addSubview(self.view)
    }

    override func didMoveToSuperview() {

        view.translatesAutoresizingMaskIntoConstraints = false

        let bottomConstraint =     view.bottomAnchor.constraint(equalTo: self.superview!.bottomAnchor)
        let leftConstraint = view.leadingAnchor.constraint(equalTo: self.superview!.leadingAnchor)
        let rightConstraint = view.trailingAnchor.constraint(equalTo: self.superview!.trailingAnchor)

        viewConstraints = [bottomConstraint, leftConstraint, rightConstraint]
        NSLayoutConstraint.activate(viewConstraints)
    }

    @IBAction func dismissButton(_ sender: Any) {
        Logger.log(message: "Dismiss button was pressed", event: .d)
        self.isHidden = true
    }

然后我通过执行以下操作将此 UIView 添加到我的 UIViewController

var ConnectionLostAlert: ConnectionLostAlertUIView!
ConnectionLostAlert = ConnectionLostAlertUIView(frame: CGRect.zero)
self.view.addSubview(ConnectionLostAlert)

好吧,我可以为 CGRect 使用实际值而不是零,但问题是在我的 UIView 中添加约束后,我的 UIView 中的按钮停止响应。如果我实际上设置了一些 CGRect 坐标并且不在 UIView 中使用约束,它就可以正常工作。有没有更好的方法来完成我正在努力实现的目标,它仍然允许我处理 UIView 内的按钮事件?

最佳答案

问题是您正在从内部 View 添加约束,即 View 到 super View ,跳过实际上被添加到 super View 的主视图 (ConnectionLostAlertUIView)。

您应该做的是首先在 view 和 self 之间添加约束。然后当 self(ConnectionLostAlertUIView) 添加到 superview 时,然后添加与 super view 的约束。

做这样的事情:

@IBOutlet var view: UIView!
var viewConstraints: [NSLayoutConstraint] = []

override init(frame: CGRect) {
    super.init(frame: frame)
    Bundle.main.loadNibNamed("ConnectionLostAlertView", owner: self, options: nil)
    self.addSubview(self.view)

    view.translatesAutoresizingMaskIntoConstraints = false

    let bottomConstraint =     view.bottomAnchor.constraint(equalTo: self.bottomAnchor)
    let leftConstraint = view.leadingAnchor.constraint(equalTo: self.leadingAnchor)
    let rightConstraint = view.trailingAnchor.constraint(equalTo: self.trailingAnchor)

    viewConstraints = [bottomConstraint, leftConstraint, rightConstraint]
    NSLayoutConstraint.activate(viewConstraints)
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    Bundle.main.loadNibNamed("ConnectionLostAlertView", owner: self, options: nil)
    self.addSubview(self.view)
}

override func didMoveToSuperview() {

    self.translatesAutoresizingMaskIntoConstraints = false

    let bottomConstraint =     self.bottomAnchor.constraint(equalTo: self.superview!.bottomAnchor)
    let leftConstraint = self.leadingAnchor.constraint(equalTo: self.superview!.leadingAnchor)
    let rightConstraint = self.trailingAnchor.constraint(equalTo: self.superview!.trailingAnchor)

    viewConstraints = [bottomConstraint, leftConstraint, rightConstraint]
    NSLayoutConstraint.activate(viewConstraints)
}

@IBAction func dismissButton(_ sender: Any) {
    Logger.log(message: "Dismiss button was pressed", event: .d)
    self.isHidden = true
}

关于ios - 除非我指定正确的 CGRect,否则 UIView 上的按钮没有响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50480761/

相关文章:

ios - 使用 RxSwift 删除多个 UITableView 项目不适用于自定义单元格

ios - 消除多个项目中使用的类重复的专业方法是什么?

ios - Swift:重用代码将类传递给参数

swift - “Fatal error: Unexpectedly found nil while unwrapping an Optional value”是什么意思?

objective-c - 如何创建纵向和横向布局的 UIView

ios 将 UIScrollView 滚动条颜色更改为不同的颜色

ios - Objective-C 如何列出所有可用的运营商网络?

c - 在 Swift 中读取二进制 (.hgt) 文件(将代码从 C++ 迁移到 swift)

iPhone UIAnimation 使用 block 不工作

ios - 在等待主视图加载时显示 UIView?