Я хочу анимировать обновление содержимого сцены, как если бы он переходил на другой View Controller.Например, представьте сцену календарной страницы с сегодняшними событиями.Размах влево обновляет содержимое до событий завтрашнего дня, но View Controller и сцена совпадают.Тем не менее, я хотел бы анимировать новый контент, скользящий справа.
Я пытался анимировать, перемещая весь вид влево.И это работает, но он показывает черный экран внизу, который, хотя и быстро заменяется на правильное содержимое, тем не менее, сотрясает.
Я помню, что в те дни HyperCard вы могли заблокировать отображение карты, обновить содержимое,затем разблокируйте дисплей с помощью перехода, скажем, растворите или сотрите.Я понимаю, что, вероятно, дело обстоит не так, как в iOS, но я упоминаю это просто, чтобы помочь описать, что я пытаюсь сделать.
Добавление кода, который распознает жесты и перемещает их ...
@objc func swipeDetected(gesture: UIGestureRecognizer) {
let calendar = Calendar.current
if let swipeGesture = gesture as? UISwipeGestureRecognizer {
switch swipeGesture.direction {
case .left:
// move current page to the left
animateViewMoving(right: false, timeInterval: 0.3)
// update content
currentDate = calendar.date(byAdding: .day, value: 1, to: currentDate)!
populateSchedItems()
self.tableView.reloadData()
// return page with no duration
animateViewMoving(right: true, timeInterval: 0.0)
case .right:
// move page to left with no duration
animateViewMoving(right: false, timeInterval: 0.0)
// update content
currentDate = calendar.date(byAdding: .day, value: -1, to: currentDate)!
populateSchedItems()
self.tableView.reloadData()
// slide new content in from the left
animateViewMoving(right: true, timeInterval: 0.3)
default:
break
}
}
}
func animateViewMoving (toTheRight: Bool, timeInterval: Double) {
let frameWidth = self.view.frame.width
let movementDuration:TimeInterval = timeInterval
let movement:CGFloat = ( toTheRight ? frameWidth : -frameWidth)
UIView.beginAnimations( "animateView", context: nil)
UIView.setAnimationBeginsFromCurrentState(true)
UIView.setAnimationDuration(movementDuration )
self.view.frame = self.view.frame.offsetBy(dx: movement, dy: 0)
UIView.commitAnimations()
}