将imageView的新框架设置为storyboard对象的框架

时间:2015-11-01 18:07:43

标签: ios swift frame uiviewanimation

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

以下是我设置新框架的方法:

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)")

执行打印语句时,我有自定义视图的正确旧框架和新框架,但它仍未达到预期的范围。

Console output

以下是动画后自定义视图的样子:The smaller view to the top left is the custom view that is supposed to be in the same place as the large logo in the center, but as you can see it's in the wrong place and has the wrong size.

我做错了什么?刚刚开始进入动画,所以我确定我错过了一些明显的东西,但希望有人可以向我指出。

2 个答案:

答案 0 :(得分:1)

试试这个:

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

然后转到问题中的代码段:

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

但这需要在viewDidAppear中执行,因为在viewDidLoad您还没有窗口。

如果您的viewController视图是self.logoView和splashIcon的取代视图,那么转换将在viewDidLoad中运行,但您需要使用视图控制器的视图而不是窗口。 E.g。

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

self.frame = self.frameToExpandTo!

答案 1 :(得分:0)

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

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

我现在意识到在原始问题中打印出来的框架是故事板中设置的框架,而不是视图中徽标实际位置的框架,所以在viewWillLayoutSubviews中调用它给了我正确的框架在正确的时间,没有任何口吃,首先显示基础视图,就像我在viewDidAppear中调用自定义函数一样。