将 imageView 的新框架设置为故事板对象的框架

Setting new frame of imageView to frame of storyboard object

当我的应用程序启动时,我有一个自定义启动画面,它只有徽标,旨在为徽标制作动画,使其与登录屏幕上的徽标框架对齐。所以在 viewDidLoad() 中,我得到了故事板对象的框架,并尝试在动画期间将该框架设置为我的自定义视图的新框架。我 运行 遇到了一个奇怪的问题,虽然自定义视图移动到一个新位置,但视图不是预期的大小或位置。

这是我设置新框架的方法:

print("Existing frame: \(self.frame)")
print("New frame: \(self.frameToExpandTo!)")
self.frame = self.frameToExpandTo!
self.frame.size = self.frameToExpandTo!.size
self.center = self.newCenter!
self.layoutIfNeeded()
print("Frame after update: \(self.frame)")

当执行打印语句时,我有正确的自定义视图的旧框架和新框架,但它仍然没有达到预期的效果。

这是自定义视图在动画之后的样子:

我做错了什么?刚开始更多地接触动画,所以我确定我遗漏了一些明显的东西,但希望有人能向我指出。

试试这个:

splashIcon.frameToExpandTo = self.logoView.window!.convertRect(self.logoView.bounds, fromView:self.logoView)

然后是问题中的代码片段:

self.frame = self.window!.convertRect(self.frameToExpandTo!, toView:self)

但这需要在 viewDidAppear 中执行,因为在 viewDidLoad 你还没有 window。

如果您的 viewController 的视图是 self.logoView 和 splashIcon 的替代视图,那么转换将从 viewDidLoad 进行,但您需要使用您的视图进行转换控制器而不是 window。例如

splashIcon.frameToExpandTo = self.splashIcon.superview!.convertRect(self.logoView.bounds, fromView:self.logoView)

self.frame = self.frameToExpandTo!

经过多次讨论并感谢@DisableR,我找到了解决方案。它包括在我的自定义函数中获取这样的新框架:splashIcon!.frameToExpandTo = splashIcon!.superview!.convertRect(self.logoView.bounds, fromView: self.logoView)

此外,我没有在 viewDidLoad 中调用此自定义函数,而是在 viewWillLayoutSubviews 中调用它,它为我尝试完成的动画提供了正确的帧。

我现在意识到,在我最初的问题中打印出的框架是情节提要中设置的框架,而不是徽标在视图中实际所在位置的框架,因此在 viewWillLayoutSubviews 中调用它给了我在正确的时间正确的框架,通过首先显示底层视图而没有任何卡顿,就像在 viewDidAppear.

中调用我的自定义函数时所做的那样