UIButton в представлении с анимацией, не обнаруживающей прикосновение

Я следую учебному пособию по созданию интерактивной всплывающей анимации ( http://www.swiftkickmobile.com/building-better-app-animations-swift-uiviewpropertyanimator/) и теперь хотел бы добавить кнопки во всплывающее окно, а не статический текст как в учебнике.

Анимация работает нормально, но кнопки не распознают касания. Прикосновение к кнопке заставляет анимацию повернуться вспять, вместо того, чтобы печатать мой "тест" По результатам исследований, это выглядит как проблема с иерархиями представлений, анимацией, отключающей нажатие кнопки, или проблемами макета / ограничений с кнопкой. Я пытался решить вышеуказанные проблемы, но ничего не помогло, надеялся, что кто-нибудь сможет помочь?

Я пропустил код, относящийся к анимации, так как думаю, что проблема связана с макетом (и анимация, кажется, работает нормально), но это все еще много; заранее извиняюсь за большое количество кода.

class ViewController: UIViewController {

private let popupOffset: CGFloat = 440

private lazy var contentImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.image = #imageLiteral(resourceName: "Background")
    return imageView
}()

private lazy var overlayView: UIView = {
    let view = UIView()
    view.backgroundColor = .black
    view.alpha = 0
    return view
}()

private lazy var popupView: UIView = {
    let view = UIView()
    view.backgroundColor = .white
    view.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
    view.layer.shadowColor = UIColor.black.cgColor
    view.layer.shadowOpacity = 0.1
    view.layer.shadowRadius = 10
    return view
}()

private lazy var closedTitleLabel: UILabel = {
    let label = UILabel()
    label.text = "Hello"
    label.font = UIFont.systemFont(ofSize: 16, weight: UIFont.Weight.medium)
    label.textColor = UIColor.darkGray
    label.textAlignment = .center
    return label
}()

private lazy var openTitleLabel: UILabel = {
    let label = UILabel()
    label.text  = "Which door will you choose?"
    label.font = UIFont.systemFont(ofSize: 16, weight: UIFont.Weight.medium)
    label.textColor = UIColor.darkGray
    label.textAlignment = .center
    label.alpha = 0
    label.transform = CGAffineTransform(scaleX: 1.6, y: 1.6).concatenating(CGAffineTransform(translationX: 0, y: 15))
    return label
}()

private lazy var reviewsImageView: UIImageView = {
    let imageView = UIImageView()
    imageView.image = #imageLiteral(resourceName: "LabelBackground")
    return imageView
}()

let stackView = UIStackView()
let buttonA = UIButton()
let buttonB = UIButton()
let buttonC = UIButton()

override func viewDidLoad() {
    super.viewDidLoad()
    layout()
    popupView.addGestureRecognizer(panRecognizer)
}

override var prefersStatusBarHidden: Bool {
    return true
}

//Layout

private var bottomConstraint = NSLayoutConstraint()

private func layout() {
    contentImageView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(contentImageView)
    contentImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    contentImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    contentImageView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    contentImageView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    overlayView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(overlayView)
    overlayView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    overlayView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    overlayView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
    overlayView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    popupView.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(popupView)
    popupView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
    popupView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    bottomConstraint = popupView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: popupOffset)
    bottomConstraint.isActive = true
    popupView.heightAnchor.constraint(equalToConstant: 500).isActive = true

    closedTitleLabel.translatesAutoresizingMaskIntoConstraints = false
    popupView.addSubview(closedTitleLabel)
    closedTitleLabel.leadingAnchor.constraint(equalTo: popupView.leadingAnchor).isActive = true
    closedTitleLabel.trailingAnchor.constraint(equalTo: popupView.trailingAnchor).isActive = true
    closedTitleLabel.topAnchor.constraint(equalTo: popupView.topAnchor, constant: 20).isActive = true

    openTitleLabel.translatesAutoresizingMaskIntoConstraints = false
    popupView.addSubview(openTitleLabel)
    openTitleLabel.leadingAnchor.constraint(equalTo: popupView.leadingAnchor).isActive = true
    openTitleLabel.trailingAnchor.constraint(equalTo: popupView.trailingAnchor).isActive = true
    openTitleLabel.topAnchor.constraint(equalTo: popupView.topAnchor, constant: 20).isActive = true

    reviewsImageView.translatesAutoresizingMaskIntoConstraints = false
    popupView.addSubview(reviewsImageView)
    reviewsImageView.leadingAnchor.constraint(equalTo: popupView.leadingAnchor).isActive = true
    reviewsImageView.trailingAnchor.constraint(equalTo: popupView.trailingAnchor).isActive = true
    reviewsImageView.bottomAnchor.constraint(equalTo: popupView.bottomAnchor).isActive = true
    reviewsImageView.heightAnchor.constraint(equalToConstant: 428).isActive = true

    buttonA.backgroundColor = UIColor.clear
    let heightConstraintA = buttonA.heightAnchor.constraint(equalToConstant: 135)
    heightConstraintA.isActive = true
    heightConstraintA.priority = UILayoutPriority(rawValue: 999)
    buttonA.translatesAutoresizingMaskIntoConstraints = false

    buttonA.setTitle("A", for: .normal)
    buttonA.setTitleColor(UIColor.darkGray, for: .normal)
    buttonA.backgroundColor = UIColor.clear
    buttonA.addTarget(self, action: #selector(buttonATapped(sender:)), for: .touchDown)
    //self.popupView.addSubview(buttonA)

    buttonB.backgroundColor = UIColor.clear
    let heightConstraintB = buttonB.heightAnchor.constraint(equalToConstant: 135)
    heightConstraintB.isActive = true
    heightConstraintB.priority = UILayoutPriority(rawValue: 999)
    buttonB.translatesAutoresizingMaskIntoConstraints = false

    buttonB.setTitle("B", for: .normal)
    buttonB.setTitleColor(UIColor.darkGray, for: .normal)
    buttonB.backgroundColor = UIColor.clear
    //self.popupView.addSubview(buttonB)

    buttonC.backgroundColor = UIColor.clear
    let heightConstraintC = buttonC.heightAnchor.constraint(equalToConstant: 135)
    heightConstraintC.isActive = true
    heightConstraintC.priority = UILayoutPriority(rawValue: 999)
    buttonC.translatesAutoresizingMaskIntoConstraints = false

    buttonC.setTitle("C", for: .normal)
    buttonC.setTitleColor(UIColor.darkGray, for: .normal)
    buttonC.backgroundColor = UIColor.clear
    //self.popupView.addSubview(buttonC)

    popupView.addSubview(stackView)
    stackView.backgroundColor = UIColor.clear

    stackView.addArrangedSubview(buttonA)
    stackView.addArrangedSubview(buttonB)
    stackView.addArrangedSubview(buttonC)

    stackView.translatesAutoresizingMaskIntoConstraints = false
    popupView.addSubview(stackView)
    stackView.leadingAnchor.constraint(equalTo: popupView.leadingAnchor).isActive = true
    stackView.trailingAnchor.constraint(equalTo: popupView.trailingAnchor).isActive = true
    stackView.bottomAnchor.constraint(equalTo: popupView.bottomAnchor).isActive = true
    stackView.heightAnchor.constraint(equalToConstant: 428).isActive = true

    stackView.axis = .vertical
    stackView.distribution = .fill
    stackView.translatesAutoresizingMaskIntoConstraints = false

}

@objc func buttonATapped(sender: UIButton) {
    print ("test")
}



private func animateTransitionIfNeeded(to state: State, duration: TimeInterval) {
    //Animation code
}

@objc private func popupViewPanned(recognizer: UIPanGestureRecognizer) {
    //Animation code
}
}

*** Для тех, у кого есть такая же проблема, вот как я решил ее, благодаря @OverD: я полностью удалил reviewsImageView (потому что это было только для цвета в моем случае, и я могу легко добавить цвет к UIButton вместо Затем, вместо добавления кнопок в popupView, я добавил их в представление стека и представление стека в представление popupView. Наконец, мой синтаксис для addTarget был неправильным, и по какой-то причине изменив его на touchDown вместо touchUpInside, он заработал.

1 ответ

Решение

Из предоставленного кода я заметил, что вы добавляете одни и те же кнопки несколько раз, один раз как подпредставление popView и один раз в stackView. Также вы не назначаете никаких целей для кнопок.

надеюсь, это поможет

Другие вопросы по тегам