Кнопка на UIView не отвечает, если я не укажу правильный CGRect - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь реализовать простой 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?

1 Ответ

0 голосов
/ 23 мая 2018

Проблема в том, что вы добавляете ограничения из внутреннего представления, т.е. представления в суперпредставление, пропуская основное представление (ConnectionLostAlertUIView), которое фактически добавляется в суперпредставление.

Вместо этого вы должны сначала добавить ограничения между представлением и самим собой.Затем, когда self (ConnectionLostAlertUIView) добавляется к суперпредставлению, добавьте ограничения с суперпредставлением.

Сделайте что-то вроде этого:

@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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...