- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 Swift 项目,正在学习天气 API 并试图更好地处理 AnimatedTransitions。我有一个 UITableView
使用带有图像和文本的自定义 UITableViewCell
。点击 tableView 中的单元格会转换为新的 UIViewController
作为显示(推送),整个内容嵌入到 UINavigationController
中。
当调用转换时,单元格中的图像应该移动到目标 viewController 上 UIImageView
的最终位置。然而,它所做的是在转换完成之前移动到屏幕的另一边,然后 View 发生变化,使图像看起来像快速回到 View 的中心。
我阅读了很多试图解决这个问题的教程,也阅读了很多 StackOverflow,但都没有弄明白。有人可以向我指出我错过了什么吗?我要疯了,在这里。
在原始 ViewController 中调用转换的 segue:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
self.performSegueWithIdentifier("SHOW_DETAIL", sender: self)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "SHOW_DETAIL" {
let detailVC = segue.destinationViewController as DetailViewController
let indexPathForForecast = self.tableView.indexPathForSelectedRow() as NSIndexPath!
let detailForecast = self.forecasts?[indexPathForForecast.row]
let cell = self.tableView.cellForRowAtIndexPath(indexPathForForecast) as WeatherCell
let image = cell.forecastImage.image
detailVC.forecastForDetail = detailForecast
detailVC.forecastDetailImage = image
}
}
func navigationController(navigationController: UINavigationController, animationControllerForOperation operation: UINavigationControllerOperation, fromViewController fromVC: UIViewController, toViewController toVC: UIViewController) -> UIViewControllerAnimatedTransitioning? {
if fromVC == self && toVC.isKindOfClass(DetailViewController) {
let transitionVC = AnimateToDetailVCController()
return transitionVC
} else {
return nil
}
}
这是来自 UIViewControllerAnimatedTransitioning 对象的 animateTransition 代码(编辑:解决方案代码已编辑到代码块中,感谢@jrturton!)
func animateTransition(transitionContext: UIViewControllerContextTransitioning) {
let fromViewController = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) as ViewController
let toViewController = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) as DetailViewController
let containerView = transitionContext.containerView()
let duration = self.transitionDuration(transitionContext)
let selectedRow = fromViewController.tableView.indexPathForSelectedRow()
let cell = fromViewController.tableView.cellForRowAtIndexPath(selectedRow!) as WeatherCell
let weatherSnapshot = cell.forecastImage.snapshotViewAfterScreenUpdates(false)
weatherSnapshot.frame = containerView.convertRect(cell.forecastImage.frame, fromView: fromViewController.tableView.cellForRowAtIndexPath(selectedRow!)?.superview)
cell.forecastImage.hidden = true
toViewController.view.frame = transitionContext.finalFrameForViewController(toViewController)
toViewController.view.alpha = 0
toViewController.detailImageView.hidden = true
containerView.addSubview(toViewController.view)
containerView.addSubview(weatherSnapshot)
var toFrame = toViewController.locationIs
UIView.animateWithDuration(duration, animations: { () -> Void in
// EDIT: This solved the issue, thanks JRTurton!
toViewController.view.setNeedsLayout() // Solution: This is where it was needed
toViewController.view.layoutIfNeeded() // Solution: This is where it was needed
toViewController.view.alpha = 1.0
var endRect = containerView.convertRect(toViewController.detailImageView.frame, fromView: toViewController.view)
weatherSnapshot.frame = endRect
}) { (finished) -> Void in
toViewController.detailImageView.hidden = false
cell.forecastImage.hidden = false
weatherSnapshot.removeFromSuperview()
transitionContext.completeTransition(true)
}
}
最佳答案
这很难说,但这是我的猜测:您使用的是尺寸类,以任意/任意尺寸进行设计,并且您的 View Controller 中的图像仍然以该尺寸为中心当你得到它的帧用于你的动画时,让它太靠右了。转换完成后,将进行布局传递并进行更正。
要修复,在设置 View Controller 的框架后,强制进行布局传递:
toViewController.view.setNeedsLayout()
toViewController.view.layoutIfNeeded()
在进行上述更改之前,您可以先通过检查动画之前 ImageView 的帧来确认这是否是问题所在。
关于iOS swift : UIViewControllerAnimatedTransitioning end frame in wrong position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27996873/
我想在navigationController的推送和弹出上制作一个过渡动画。但它的工作原理真的很奇怪。就像 1/5 倍一样,fromViewController 会淡出,但 toViewContro
做一个 simpel 转换但没有被调用我没有得到我在这里错过的东西。任何人都可以帮助我。没有收到任何错误或警告。 动画类-: import UIKit class CustomPresentAnima
我正在尝试使用 Pop-in 效果在 UIViewControllers 之间设置动画转换。 在我的 animateTransition(using transitionContext:) 函数中:
我已经在这里工作了几个小时,无法理解我做错了什么。我已经按照我之前的 Swift: Problems with custom UIView.transition? 中描述的 UITabBarContr
我已经创建了一个过渡并且它工作正常,除了我在模拟器中有时会出现黑角。此外,在 iPad Pro 中,如果我以全分辨率运行模拟器,我会得到一个完全黑屏。调整后的分辨率工作正常。你知道可能是什么问题吗?我
我试图使用 Swift 协议(protocol)提供 UIViewControllerAnimatedTransitioning 的通用实现,但每当我有一个符合该协议(protocol)的对象时,我都
我有一个 segue,它是通过一个按钮触发的,该按钮在当前上下文中模态显示另一个 View Controller 。我正在使用自定义类来自定义转换,它是这样的: class ShowAnimator:
在搜索如何在从一个 Controller 过渡到另一个 Controller 时执行自定义动画时,我发现了一些有关 UIViewControllerAnimatedTransitioning 的信息。
我已经为全屏显示的 Controller 实现了交互式关闭动画。 问题是每当我尝试关闭它时,状态栏都会出现 全屏 Controller 的 - (BOOL)prefersStatusBarHidden
我已经在 navigationController 上成功实现了 UIViewControllerAnimatedTransitioning,并且在 iOS 7 上有一个很好的自定义转换。 现在的问题
我在ViewController A中实现了这个方法 - (BOOL)prefersStatusBarHidden { return NO; } 我在 ViewController B 中实现了该
我正在尝试制作自定义演示动画,但 VC 是一个 MPMoviePlayerViewController。我正在学习本教程: 当我呈现 MPMoviePlayerViewController 时,一切正
自定义过渡对我来说相当陌生。我不得不将它们合并到我工作的最后一个项目中,并最终使用 UIViewControllerAnimatedTransitioning 协议(protocol)和自定义 seg
所以我开始着手创建自定义插入/弹出转换,第一次插入转换时一切正常,但是当我尝试插入另一个 View Controller 时,我根本看不到任何动画。 Here is a sample project
我试图在推送 UIViewController 时进行简单的动画转换,但似乎我遗漏了一些东西。 我将 subview 的快照从 fromViewController 动画化到 toViewContro
我正在尝试使用 UIViewcontrollerAnimatedTransitioning 为 PopUp ViewController 呈现动画。我已经创建了一个从 TableViewCell 到我
我刚刚花了最后几个小时来追踪一个恰好位于转换驱动程序对象中的错误,多次调用 interruptibleAnimator 方法,其中: 一个 UIViewPropertyAnimator 完成闭包包含对
将 View Controller 推送到 UINavigationController 时如何获得自定义转换 (iOS7)?我尝试在 UINavigationController 和我正在推送的 C
我今天刚用 Swift4 升级到 XCode9。我发现我的 UIViewControllerAnimatedTransitioning 不再按预期工作。这个动画的效果是fromView会缩小到0.95
我正在使用一些 UIViewController包含在 UINavigationController 中. 一个人会收到一个推送 segue来自UIButton在 storyboard 上, 然后使用
我是一名优秀的程序员,十分优秀!