Как анимировать отображение того же View Controller, но с обновленным содержимым - PullRequest
0 голосов
/ 12 июня 2018

Я хочу анимировать обновление содержимого сцены, как если бы он переходил на другой 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()
}

1 Ответ

0 голосов
/ 12 июня 2018

Возьмите представление снимка текущего содержимого и поместите его позади текущего представления.(Это даст нам что-то кроме черного окна для просмотра позади анимации.) Теперь сделайте именно то, что вы уже делаете: переместите реальный вид в сторону и анимируйте его. Теперь тихо удалите вид снимка.

enter image description here

...