Как изменить ширину UITableView с анимацией?

У меня UITableView на левом размере и простой UIView на правой стороне в моем UIViewController

  • UITableView подключается к .top , .leading и .bottom
  • UIView подключается к .top , .trailing и .bottom , а также имеет .width
  • И UITableView .leading == .trailing из UIView

Все эти ограничения вы можете увидеть на скриншоте:

введите описание изображения здесь

Вот мой код анимации в контроллере, как вы можете видеть, я обновляю .width UIView а также циклически UIView анимацию.

class ViewController: UIViewController {

    @IBOutlet var widthConstaint: NSLayoutConstraint!
    @IBOutlet var tableView: UITableView!
    @IBOutlet var watchContainerView: UIView!

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

    func start() {
        DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
            if self.widthConstaint.constant == 50 {
                self.change(width: 100)
            } else {
                self.change(width: 50)
            }
            self.start()
        }
    }

    func change(width: CGFloat) {
        widthConstaint.constant = width
        UIView.animate(withDuration: 1.0) {
            self.view.layoutIfNeeded()
        }   
    }
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {   
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
        return cell
    }
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 300
    }

}

В результате вы можете увидеть это на .gif, что я должен сделать для плавной анимации, без этого глюка?

введите описание изображения здесь

Всего 3 ответа


Вы изменяете ширину вида сбоку за пределами блока анимации. поместите вас widthConstaint.constant = width внутри вашего блока анимации.

func change(width: CGFloat) {
      UIView.animate(withDuration: 1.0) {
            self.widthConstaint.constant = width
            self.view.layoutIfNeeded()
        }   
    }

Согласно вашему коду, представление анимировано, но в блок анимации UIView ограничение не накладывается. Таким образом, это похоже на сбой, потому что это меняет кадр напрямую. Пожалуйста, попробуйте изменить код, как показано ниже, и попробуйте.

func change(width: CGFloat) {
        UIView.animate(withDuration: 1.0) {
            widthConstaint.constant = width
            self.tableView.layoutIfNeeded()
            self.view.layoutIfNeeded()
        }   
    }

Вы можете использовать tableView.beginUpdates() и tableView.endUpdates() во время анимации для плавного обновления ячеек:

func change(width: CGFloat) {
    widthC.constant = width
    UIView.animate(withDuration: 1.0) {
        self.tableView.beginUpdates()
        self.view.layoutIfNeeded()
        self.tableView.endUpdates()
    }
}

Из документа: Начните обновление

Вы также можете использовать этот метод с последующим методом endUpdates (), чтобы анимировать изменение высоты строк без перезагрузки ячейки.


Есть идеи?

10000