如何设置相同View Controller的显示动画但具有更新的内容

时间:2018-06-12 15:37:41

标签: swift4 ios11 xcode9 uiviewanimation

我希望动画对sceen内容的更新,就像转换到其他视图控制器一样。例如,想象一下具有今天事件的日历页面的场景。向左滑动会将内容更新为明天的事件,但视图控制器和场景是相同的。不过,我还想从右边滑动新内容。

我尝试动画将整个视图向左移动。这样可行,但它会在下面显示一个黑色的屏幕,虽然很快就会被正确的内容取代但仍然很刺耳。

我记得在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()
}

1 个答案:

答案 0 :(得分:0)

获取当前内容的快照视图并将其放在当前视图后面。 (这将为我们提供除了黑色窗口之外的其他内容,以便在动画后面查看。)现在完成您已经在做的事情:将真实视图移到侧面并为其设置动画。现在静静地删除快照视图

enter image description here