将 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
.
中调用我的自定义函数时所做的那样
当我的应用程序启动时,我有一个自定义启动画面,它只有徽标,旨在为徽标制作动画,使其与登录屏幕上的徽标框架对齐。所以在 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
.