如何动画显示相同的视图控制器但内容已更新
How to animate display of same View Controller but with updated content
我想为场景内容的更新添加动画效果,就像转换到不同的视图控制器一样。例如,想象一个包含今天事件的日历页面的场景。向左滑动会将内容更新为明天的事件,但视图控制器和场景是相同的。尽管如此,我还是想为从右侧滑入的新内容制作动画。
我试过将整个视图向左移动的动画。这行得通,但它显示了下面的黑屏,虽然很快被正确的内容替换了,但仍然很刺耳。
我记得在 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()
}
拍摄当前内容的快照视图,并将其放在当前视图的后面。 (这会给我们一些不同于黑色 window 的东西来查看动画背后的东西。)现在做你已经在做的事情:将真实视图移到一边并为其添加动画。现在悄悄地移除快照视图。
我想为场景内容的更新添加动画效果,就像转换到不同的视图控制器一样。例如,想象一个包含今天事件的日历页面的场景。向左滑动会将内容更新为明天的事件,但视图控制器和场景是相同的。尽管如此,我还是想为从右侧滑入的新内容制作动画。
我试过将整个视图向左移动的动画。这行得通,但它显示了下面的黑屏,虽然很快被正确的内容替换了,但仍然很刺耳。
我记得在 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()
}
拍摄当前内容的快照视图,并将其放在当前视图的后面。 (这会给我们一些不同于黑色 window 的东西来查看动画背后的东西。)现在做你已经在做的事情:将真实视图移到一边并为其添加动画。现在悄悄地移除快照视图。