ios - 点击单元格时如何执行到新 ViewController 的过渡动画
问题描述
我正在尝试在点击 aUIViewController
时创建一个过渡tableView cell
。我正在使用模态 segue 转到另一个 Viewcontroller,并且我使用transitioningDelegate
我将要使用的 viewcontroller,但它仍然不会执行动画。我不确定我是否应该在prepareForSegue
or中这样做didSelectRow
。我是 ViewController 转换的新手。我该如何纠正这个。
流行动画师类
class PopAnimator: NSObject, UIViewControllerAnimatedTransitioning {
func transitionDuration(using pTransitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 1.0
}
func animateTransition(using pTransitionContext: UIViewControllerContextTransitioning) {
let containerView = pTransitionContext.containerView
guard let toView = pTransitionContext.view(forKey: .to) else { return }
containerView.addSubview(toView)
toView.alpha = 1.0
UIView.animate(withDuration: 1.0, animations: {
toView.alpha = 1.0
}) { _ in
pTransitionContext.completeTransition(true)
}
}
}
目标视图控制器
class ThingsTransitionVC: UIViewController {
@IBOutlet weak var nameLabel: UILabel!
@IBOutlet weak var detailsLabel: UILabel!
@IBOutlet weak var titleLabel: UILabel!
var transitionThing: Thing?
override func viewDidLoad() {
super.viewDidLoad()
if let thing = self.transitionThing {
self.nameLabel.text = thing.name
self.detailsLabel.text = thing.details
self.titleLabel.text = thing.title
}
}
@IBAction func cancelButton(_ sender: UIBarButtonItem) {
self.presentingViewController?.dismiss(animated: true)
}
}
列出包含 tableview 的 ViewController
class ThingsListVC: UIViewController {
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "ThingSegue" {
let navVC = segue.destination as! UINavigationController
let thingTransitionVC = navVC.topViewController as! ThingsTransitionVC
let theThing = sender as? Thing
thingTransitionVC.transitionThing = theThing
thingTransitionVC.transitioningDelegate = self
}
}
func tableView(_ pTableView: UITableView, didSelectRowAt pIndexPath: IndexPath) {
let thingSelected = self.objectForIndexPath(pIndexPath)
self.performSegue(withIdentifier: "ThingSegue", sender: thingSelected)
pTableView.deselectRow(at: pIndexPath , animated: true)
}
}
extension ThingsListVC: UIViewControllerTransitioningDelegate {
func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let popAnimator = PopAnimator()
return popAnimator
}
func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
return nil
}
}
解决方案
UIViewControllerTransitioningDelegate
在您的源 ViewController 中使用
public override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "segueIdentifier1st"
{
let controller = segue.destination as! firstVC
controller.transitioningDelegate = self
controller.modalPresentationStyle = .custom
}
else if segue.identifier == "segueIdentifier2nd"
{
let controller = segue.destination as! secondVC
controller.transitioningDelegate = self
controller.modalPresentationStyle = .custom
}
//interactiveTransition.attach(to: controller)
}
override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
return true
}
// MARK: UIViewControllerTransitioningDelegate
public func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning?
{
transition.transitionMode = .present
if presented.restorationIdentifier! == "segueIdentifier1st"
{
transition.startingPoint = CGPoint(x: btnAddWidget.center.x , y: btnAddWidget.frame.origin.y+50)
}
else if presented.restorationIdentifier! == "segueIdentifier2nd"
{
//transition.startingPoint = CGPoint(x: self.view.frame.size.width-45, y:45)
transition.startingPoint = getTransitionOrigin()
}
transition.bubbleColor = backgroundThemeColor
return transition
}
public func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
transition.transitionMode = .dismiss
if dismissed.restorationIdentifier! == "segueIdentifier1st"
{
transition.startingPoint = CGPoint(x: btnAddWidget.center.x , y: btnAddWidget.frame.origin.y+50)
}
else if dismissed.restorationIdentifier! == "segueIdentifier2nd"
{
//transition.startingPoint = CGPoint(x: self.view.frame.size.width-45, y:45)
transition.startingPoint = getTransitionOrigin()
}
transition.bubbleColor = backgroundThemeColor
return transition
}
推荐阅读
- react-native - 调试反应原生项目
- android-studio - 启动 Androir Studio 3.0.1 时出现模拟器错误
- php - 点击广告后如何在页面上发送用户
- java - Jersey Http Server:为每个 http 方法添加参数
- netlogo - Netlogo:[ifelse] 命令/预期命令
- haskell - 为什么我不能在 Stack 项目中使用 Text.Regex?
- javascript - 动态创建多维javascript对象
- python - 如何在转换为 Dataframe 之前展平复杂的 json
- c# - 带有 ASP.NET Core 2.2 的 Razor 页面中的嵌套/子区域
- maven - 未生成黄瓜报告