Взаимодействие с ViewController, который имеет несколько дочерних ViewControllers - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть родительский viewController и дочерний viewController.ChildViewController похож на карту и функционирует аналогично приложению Apple для акций или карт.Я могу развернуть или свернуть его и взаимодействовать с кнопками внутри него.Единственная проблема заключается в том, что я не могу взаимодействовать с какими-либо кнопками в родительском viewController.Кто-нибудь знает, в чем проблема.

enter image description here

class BaseViewController: UIViewController {

enum CardState {
    case expanded
    case collapsed
}

var cardViewController: CardViewController!
var visualEffectView: UIVisualEffectView!

lazy var deviceCardHeight: CGFloat = view.frame.height - (view.frame.height / 6)
lazy var cardHeight: CGFloat = deviceCardHeight
let cardHandleAreaHeight: CGFloat = 65

var cardVisible = false
var nextState: CardState {
    return cardVisible ? .collapsed : .expanded
}

override func viewDidLoad() {
    super.viewDidLoad()
    setupCard() 
}

@IBAction func expandCard(_ sender: Any) {
    print("Button Pressed")
}
func setupCard() {

    cardViewController = CardViewController(nibName: "CardViewController", bundle: nil)
    self.addChild(cardViewController)
    self.view.addSubview(cardViewController.view)

    //Set up frame of cardView
    cardViewController.view.frame = CGRect(x: 0, y: view.frame.height - cardHandleAreaHeight, width: view.frame.width, height: cardHeight)

    cardViewController.view.clipsToBounds = true

    let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleCardTap(recognizer:)))
         cardViewController.handleArea.addGestureRecognizer(tapGestureRecognizer)

}

@objc func handleCardTap(recognizer: UITapGestureRecognizer) {
    switch recognizer.state {
    case .ended:
        animationTransitionIfNeeded(state: nextState, duration: 0.9)
    default:
        break
    }
}

 func animationTransitionIfNeeded(state: CardState, duration: TimeInterval) {
    if runningAnimations.isEmpty {
        let frameAnimator = UIViewPropertyAnimator(duration: duration, dampingRatio: 1) {
            switch state {
            case .expanded:
                self.cardViewController.view.frame.origin.y = self.view.frame.height - self.cardHeight
            case .collapsed:
                self.cardViewController.view.frame.origin.y = self.view.frame.height - self.cardHandleAreaHeight
            }
        }

        frameAnimator.addCompletion { _ in
            //if true set to false, if false set to true
            self.cardVisible = !self.cardVisible
            self.runningAnimations.removeAll()
        }

        frameAnimator.startAnimation()
        runningAnimations.append(frameAnimator)

        let cornerRadiusAnimator = UIViewPropertyAnimator(duration: duration, curve: .linear) {
            switch state {
            case .expanded:
                self.cardViewController.view.layer.cornerRadius = 12
            case .collapsed:
                self.cardViewController.view.layer.cornerRadius = 0
            }
        }

        cornerRadiusAnimator.startAnimation()
        }
     }

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

Я решаю это.Этот код должен работать отлично.Причина, почему это не было раньше, была в том, что я добавил в visualEffectView.Это покрывало родителя.

0 голосов
/ 08 февраля 2019

«Невозможно взаимодействовать» означает, что вы не можете нажать.В этом случае наиболее вероятной причиной является то, что кнопка покрыта чем-то (она может быть прозрачной, поэтому убедитесь, что при тестировании нет прозрачных фонов, пока вы не решите эту проблему).Другая возможная причина заключается в том, что вы установили какое-то свойство кнопки, которое будет вызывать такое поведение, но вы, вероятно, знаете об этом, поэтому почти наверняка это первое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...