Как отрегулировать высоту дочернего контроллера представления, чтобы соответствовать высоте представления контейнера - PullRequest
0 голосов
/ 07 апреля 2019

У меня есть контейнер View с регулируемой высотой. Теперь я хочу установить ту же рамку представления контроллера дочернего представления в соответствии с высотой представления контейнера. Иногда это работает в симуляции, но часто это не удается. Кадр представления контроллера дочернего представления часто остается таким же, как определено в начале. Знаете ли вы обходной путь для решения этой проблемы?

Вот мой главный ViewController с containerView по имени bottomView

class ViewController: UIViewController {
    var startPosition: CGPoint!
    var originalHeight: CGFloat = 0
    var bottomView = UIView()
    var gestureRecognizer = UIPanGestureRecognizer()
    let scrollView = UIScrollView()
    let controller = EditorViewController()

    override func viewDidLoad() {
        self.view.backgroundColor = .white 
        view.addSubview(bottomView)
        bottomView.translatesAutoresizingMaskIntoConstraints = false
        bottomView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        bottomView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
        bottomView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
        bottomView.heightAnchor.constraint(equalToConstant: 100).isActive = true
        bottomView.backgroundColor = .white

        gestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(viewDidDragged(_:)))
        bottomView.isUserInteractionEnabled = true
        bottomView.addGestureRecognizer(gestureRecognizer)

        // add childviewController

        self.addChild(controller)
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        controller.view.frame = bottomView.bounds
        bottomView.addSubview(controller.view)        
        controller.view.rightAnchor.constraint(equalTo: bottomView.rightAnchor).isActive = true
        controller.view.leftAnchor.constraint(equalTo: bottomView.leftAnchor).isActive = true
        controller.view.bottomAnchor.constraint(equalTo: bottomView.bottomAnchor).isActive = true
        controller.view.topAnchor.constraint(equalTo: bottomView.topAnchor).isActive = true
        controller.didMove(toParent: self)

    }
}

Контроллер childView выглядит следующим образом:

class EditorViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .red   
    }

И таким образом я изменил высоту представления контейнера и попытался также отрегулировать высоту дочернего элемента viewController. Но это не работает.

@objc func viewDidDragged(_ sender: UIPanGestureRecognizer) {

        if sender.state == .began {
            startPosition = gestureRecognizer.location(in: self.view) // the postion at which PanGestue Started
            originalHeight = bottomView.frame.size.height
        }
        if sender.state == .began || sender.state == .changed {
            let endPosition = sender.location(in: self.view)
            let difference = endPosition.y  - startPosition.y
            let newHeight = originalHeight - difference
            if self.view.frame.size.height - endPosition.y < 100 {
                bottomView.frame = CGRect(x: 0, y: self.view.frame.size.height - 100, width: self.view.frame.size.width, height: 100)
                controller.view.frame = bottomView.bounds  
            } else {
                bottomView.frame = CGRect(x: 0, y: self.view.frame.size.height - newHeight, width: self.view.frame.size.width, height: newHeight)
                controller.view.frame = bottomView.bounds
            }
        }

        if sender.state == .ended || sender.state == .cancelled {
            //Do Something
        }
    }

1 Ответ

0 голосов
/ 07 апреля 2019

Попробуйте использовать ограничение для изменения высоты. Что-то вроде:

class ViewController: UIViewController {
  ...

  var heightConstraint: NSLayoutConstraint?

  override func viewDidLoad() {

    ...

    heightConstraint = bottomView.heightAnchor.constraint(equalToConstant: 100)
    heightConstraint?.isActive = true

    ....

  }

  @objc func viewDidDragged(_ sender: UIPanGestureRecognizer) {

    ...

    if sender.state == .began || sender.state == .changed {
      let endPosition = sender.location(in: self.view)
      let difference = endPosition.y  - startPosition.y
      let newHeight = originalHeight - difference
      if self.view.frame.size.height - endPosition.y < 100 {
        heightConstraint?.constant = 100
      } else {
        heightConstraint?.constant = newHeight
      }
    }

    ...

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