Как анимировать отображение выпадающего меню?

#ios #swift #iphone #xcode

#iOS #swift #iPhone #xcode

Вопрос:

Мне нужна помощь в создании выпадающего меню с таблицей из дочернего контроллера.

Пример кода:

 
class ParentViewController: UIViewController {


  func displayShowCountries() {

   if let textField = self.activeTextField, let superview = textField.superview {
       let convert = superview.convert(textField.frame, to: self.view)

       let row = viewModel.count - 1
       let indexPath = IndexPath(row: row, section: 0)
       guard let cell = tableView.cellForRow(at: indexPath) else { return }
       let cellConvert = tableView.convert(cell.frame, to: self.view)


       addChild(selectCountry)
       view.addSubview(selectCountry.view)
       selectCountry.didMove(toParent: self)

       // start frame
       selectCountry.view.frame = CGRect(x: convert.origin.x, y: convert.maxY, width: convert.width, height: 0)

       let height = (cellConvert.origin.y - convert.origin.y)   8

       UIView.animate(
          withDuration: 0.3, 
          delay: 0, 
          usingSpringWithDamping: 1, 
          initialSpringVelocity: 1, 
          options: .curveEaseOut, 
          animations: {
               self.selectCountry.view.frame = CGRect(x: convert.origin.x, y: convert.maxY, width: convert.width, height: height)
          },
          completion: nil)
    }

  }
}
  

Для SelectCountry()

 class SelectCountry: UIViewController {

   override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        tableView.frame = view.bounds
    }

}
  

Анимация работает только для selectCountry.view , но все, в чем она находится, selectCountry.view не отображается с анимацией.

Комментарии:

1. Как вы создаете свою selectCountry? Используете ли вы автозапись?

2. Что именно вы имеете в виду под «nutria»? merriam-webster.com/dictionary/nutria

3. Y.Бонафоны Я не использую автозапись.

Ответ №1:

Попробуйте добавить self.view.layoutIfNeeded() в блок анимации, например, следующее

  UIView.animate(
          withDuration: 0.3, 
          delay: 0, 
          usingSpringWithDamping: 1, 
          initialSpringVelocity: 1, 
          options: .curveEaseOut, 
          animations: {
               self.selectCountry.view.frame = CGRect(x: convert.origin.x, y: convert.maxY, width: convert.width, height: height)
    self.view.layoutIfNeeded()
          },
          completion: nil)
  

Ответ №2:

анимация не будет работать с подвидами вашего selectCountry.view, потому что вы анимируете только фрейм selectCountry.view, а поскольку фреймы его подвидов не являются «относительными» к его фрейму, они не будут анимироваться, поэтому вы должны использовать автозапуск, даже программно, по крайней мере, для установки ограничений подвидов относительноselectCountry.view, таким образом, когда его фрейм изменится, соответственно изменится и их

Комментарии:

1. Не могли бы вы привести пример, если вам не сложно?