ios - 动画 View 中的 UIButton 未检测到触摸

标签 ios swift uibutton uiviewpropertyanimator

我正在按照教程创建交互式弹出动画 ( http://www.swiftkickmobile.com/building-better-app-animations-swift-uiviewpropertyanimator/ ),现在想向弹出窗口添加按钮,而不是像教程中那样使用静态文本。

动画工作正常,但按钮未检测到触摸。触摸按钮会导致动画反转,而不是打印我的“测试”语句。 根据研究,这似乎是 View 层次结构的问题、禁用按钮触摸的动画或按钮的布局/约束问题。我已经尝试解决上述问题,但没有任何效果,希望有人能够提供帮助吗?

我省略了与动画相关的代码,因为我认为问题与布局有关(并且动画似乎工作正常) - 但它仍然很多;对于大量代码提前表示歉意。

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,而是将它们添加到堆栈 View 和堆栈 View 到弹出 View 。最后,我的 addTarget 语法不正确,并且出于某种原因将其更改为 touchDown 而不是 touchUpInside 使其工作。

最佳答案

我从提供的代码中注意到,您多次添加相同的按钮,一次作为 popView 的 subview ,一次在 stackView 中。此外,您没有为按钮分配任何目标。

希望这有帮助

关于ios - 动画 View 中的 UIButton 未检测到触摸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52824415/

相关文章:

ios - 包含在对 Firebase 的查询中

ios - 如何访问 cocoa pod 库并向其添加模块?

ios - UILabel作为tableViewCell的accessoryView向上移动

ios - Branch.io - 链接打开应用程序但未获取其中的数据

iphone - iOS 7.1 : UIButton's selected title not working

ios 9 objective-c 屏幕尺寸问题

ios - 使用核心数据插入/更新记录的最有效方法?

javascript - 在 React 站点中使用搜索栏时,iOS 键盘不会关闭

iphone - 让 uibutton 跳动。

swift - 多个按钮可实现一个操作,无需 IB