Как закрыть UITableViewController путем перетаскивания (панорамирование)

Я работаю над созданием приложения iOS.

Теперь я застрял, чтобы сделать следующее.

  • экран подробностей отображается как модальный экран
  • пользователь хочет закрыть модальное окно, перетащив его вниз, как экран экрана Twitter

И я попытался закодировать по ссылке Как использовать UIPanGestureRecognizer для перемещения объекта? iPhone / IPad

Мой код выглядит ниже. Это приводит к тому, что tableView перемещается в странное направление, а затем закрывает модальный.

var firstX: CGFloat = 0 var firstY: CGFloat = 0 var finalX: CGFloat = 0 var finalY: CGFloat = 0 override func viewDidLoad() { super.viewDidLoad() let recognizer : UIPanGestureRecognizer = UIPanGestureRecognizer(target: self, action: "move:") recognizer.minimumNumberOfTouches = 1 recognizer.maximumNumberOfTouches = 1 self.tableView.addGestureRecognizer(recognizer) } func move(sender : UIPanGestureRecognizer) { print("move") self.view.bringSubviewToFront(tableView) var translatedPoint : CGPoint = sender.translationInView(self.view) if sender.state == UIGestureRecognizerState.Began { firstX = 0 // (sender.view?.center.x)! firstY = (tableView?.center.y)! } translatedPoint = CGPointMake(firstX+translatedPoint.x, firstY) tableView?.center = translatedPoint if sender.state == UIGestureRecognizerState.Ended { let velocityY = 0.2 * sender.velocityInView(self.view).y finalX = firstX //translatedPoint.x + velocityX finalY = translatedPoint.y + velocityY if (UIDeviceOrientationIsPortrait(UIDevice.currentDevice().orientation)) { if finalY < 0 { finalY = 0 } else if finalY > 1024 { finalY = 1024 } } else { if finalY < 0 { finalY = 0 } else if finalY > 768 { finalY = 1024 } } let animationDuration = ( abs(velocityY) * 0.0002 ) + 0.2 UIView.beginAnimations(nil, context: nil) UIView.setAnimationDuration(Double(animationDuration)) UIView.setAnimationCurve(UIViewAnimationCurve.EaseOut) UIView.setAnimationDelegate(self) UIView.setAnimationDidStopSelector("animationDidFinish") self.view.center = CGPointMake(finalX, finalY) UIView.commitAnimations() } } func animationDidFinish() { print("animationDidFinish") if finalY > 50 { self.dismissViewControllerAnimated(true, completion: nil) } } 

Кто-нибудь указывает мне в правильном направлении? Заранее спасибо.

Solutions Collecting From Web of "Как закрыть UITableViewController путем перетаскивания (панорамирование)"

Вам нужно будет создать пользовательскую модальную анимацию. Вы должны прочитать « Настройка анимаций перехода » из раздела « Презентация и переходы » Руководства по программированию контроллера просмотра для iOS .

В частности, там есть часть « Добавление интерактивности к вашим переходам» , но вам, вероятно, нужно будет прочитать больше, чем просто эту часть, чтобы понять.

Короче говоря, вам нужно будет создать реализацию UIViewControllerTransitioningDelegate и назначить это UIViewControllerTransitioningDelegate делегату контроллера представления. Задача UIViewControllerTransitioningDelegate заключается в том, чтобы предоставить в UIViewControllerTransitioningDelegate ряд других объектов, которые обрабатывают пользовательскую анимацию (и необязательно презентацию) для представления и отклонения контроллера вида.

В дополнение к вашей реализации UIViewControllerTransitioningDelegate вам также придется создавать реализации UIViewControllerAnimatedTransitioning и UIViewControllerInteractiveTransitioning . В конечном итоге эти объекты будут выполнять соответствующие анимации, и они являются объектами, UIKit для UIKit с UIViewControllerTransitioningDelegate реализации UIViewControllerTransitioningDelegate .