UIButton в представлении с анимацией, не обнаруживающей прикосновение - PullRequest
0 голосов
/ 15 октября 2018

Я следую учебному пособию по созданию интерактивной всплывающей анимации (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 Ответ

0 голосов
/ 16 октября 2018

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

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

...