2016-10-06 5 views
4

Я делаю свои первые пользовательские анимации segue. Я хочу иметь представление списка, которое, когда я выбираю строку, вместо того, чтобы скользить со стороны, расширяется на месте из выбранной строки. Нечто подобное:Пользовательский режим размотки segue для отображения анимации

enter image description here

Таким образом, пользователь выбирает зеленый строку, которая вызывает новый контроллер для запуска на зеленый размер строки и расширить, чтобы заполнить экран. До сих пор эта часть работала нормально.

Проблема, с которой я столкнулся, заключается в том, чтобы развернуть сеанс, который пытается сделать обратное, свернуть весь экран обратно до исходной строки, а затем убрать. То, что происходит, это то, что он сжимается хорошо, но область экспозиции остается черной, а затем внезапно вспыхивает на месте, когда анимация завершена. Что хотел что-то вроде этого:

enter image description here

Но что происходит это примерно так:

enter image description here

код я использую для размотки-х perform выглядит следующим образом:

class FromScheduleFocusSegue: UIStoryboardSegue { 
    override func perform() { 
     let fromView = self.source.view! 
     let toView = self.destination.view! 
     let window = UIApplication.shared.keyWindow! 
     let schedulesList = self.destination as! SchedulesListController 
     let cell = schedulesList.tableView.cellForRow(at: schedulesList.tableView.indexPathForSelectedRow!)! 
     var stripe = cell.bounds 
     stripe.size.height = 60 
     let targetFrame = cell.convert(stripe, to: window).insetBy(dx: 0, dy: 0) 
     schedulesList.tableView.selectRow(at: nil, animated: false, scrollPosition: .none) 
     UIView.animateWithDuration(4000.milliseconds, delay: 0.seconds, options: .curveEaseInOut, animations: { 
      fromView.frame = targetFrame 
     }) { (finished) in 
      self.source.dismiss(animated: false, completion: nil) 
     } 
    } 
} 

Итак, как мне получить представление, которое я ищу, чтобы отображаться как анимация происходит?

Для полноты, вот вперед код Segue:

class ToScheduleFocusSegue: UIStoryboardSegue { 
    override func perform() { 
     let fromView = self.source.view! 
     let toView = self.destination.view! 
     let window = UIApplication.shared.keyWindow! 
     let box = UIScreen.main.bounds 
     let schedulesList = self.source as! SchedulesListController 
     let cell = schedulesList.tableView.cellForRow(at: schedulesList.tableView.indexPathForSelectedRow!)! 
     toView.frame = cell.convert(cell.bounds, to: window).insetBy(dx: 0, dy: 0) 
     window.insertSubview(toView, aboveSubview: fromView) 
     UIView.animateWithDuration(4000.milliseconds, delay: 0.seconds, options: .curveEaseInOut, animations: { 
      toView.frame = box 
      }) { (finished) in 
       self.source.present(self.destination, animated: false, completion: nil) 
     } 
    } 
} 

(Это в XCode8, ориентированное на iOS10 с помощью Swift3)

+0

Вы должны использовать пользовательские переходы вместо этого./UIPпредставлениеКонтроллер и семья. – Andy

+0

Если вы можете показать мне пример, чтобы заставить меня двигаться в правильном направлении, что делает то, что я хочу визуально, щедрость ваша. –

+0

Я бы посмотрел больше в UICollectionView. Например, см. Раздел «Анимация макета коллекции для общих переходов» здесь https://www.objc.io/issues/12-animations/collectionview-animations/ –

ответ

0

Попробуйте имея контроллер представления, что делает презентацию также сделать смещать ,

Так что в вашем размотки Segue:

UIView.animateWithDuration(4000.milliseconds, delay: 0.seconds, options: .curveEaseInOut, animations: { 
     fromView.frame = targetFrame 
    }) { (finished) in 
     self.destination.dismiss(animated: false, completion: nil) // the destination is the one that presented the current view 
    } 
+0

Не имеет значения. Я удивлен, я ожидал, что что-то изменится, ошибка или какая-то другая разница, но визуальное поведение было таким же, и ничего не было на выходе консоли. –

Смежные вопросы