当我的应用程序启动时,我有一个自定义的启动画面,它只有徽标,旨在为徽标设置动画,使其与登录屏幕上的徽标框架对齐。所以在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)")
执行打印语句时,我有自定义视图的正确旧框架和新框架,但它仍未达到预期的范围。
我做错了什么?刚刚开始进入动画,所以我确定我错过了一些明显的东西,但希望有人可以向我指出。
答案 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
中调用自定义函数一样。