У меня 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 (), чтобы анимировать изменение высоты строк без перезагрузки ячейки.