2015-11-01 26 views
0

当我的应用程序启动时,我有一个自定义启动屏幕,它只有标志,并且旨在为徽标设置动画,以便它与登录屏幕上徽标的框架排成一行。因此,在viewDidLoad()中,我获取了故事板对象的框架,并尝试在动画期间将该框架设置为我自定义视图的新框架。虽然自定义视图移动到新位置的位置,但我遇到了一个奇怪的问题,但视图的大小或位置并不像预期的那样。将imageView的新框架设置为故事板对象的框架

下面是如何设置的新框架:

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.

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

+0

什么是self.frameToExpandTo?你如何检索它? – DisableR

+0

在我创建自定义'subView'的'viewDidLoad'中,我设置了'splashIcon.frameToExpandTo = self.logoView.frame',其中'logoView'是一个连接到徽标的IBOutlet。 – pbush25

回答

0

所以经过多次商谈,并感谢@DisableR,我发现我的解决方案。它包括越来越喜欢这个新的框架在我的自定义函数:splashIcon!.frameToExpandTo = splashIcon!.superview!.convertRect(self.logoView.bounds, fromView: self.logoView)

而且进一步,而不是在viewDidLoad调用这个自定义函数,我把它叫做在viewWillLayoutSubviews这给了我为我试图动画的正确帧完成。

我现在意识到在我原来的问题中打印出来的框架是在故事板中设置的框架,而不是标识实际位于视图中的框架,所以在viewWillLayoutSubviews中调用此框架可以在右侧给出正确的框架如果我的自定义函数是在viewDidAppear中调用的,那么首先显示底层视图就不会出现任何结局。

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起作用,但您需要使用视图控制器而不是窗口进行转换。例如。

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

self.frame = self.frameToExpandTo! 
+0

好的进步!这确实起作用,但是因为它在'viewDidAppear'中,所以底层视图首先出现,这使得UI看起来像是口吃。任何建议? – pbush25

+0

问题在于不同的坐标系。不幸的是,直到你splashIcon是一个窗口(因此,viewDidAppear被称为)上,有一个坐标从一个视图层次结构转换为另一种不合法的方式。在这种情况下,只有硬编码才能完成这项工作。 – DisableR

+0

嗯,我不能硬编码,因为它在所有的屏幕尺寸工作。但是不应该在'viewDidLoad'中设置框架?这是一个隐含的解包可选项,你应该可以从那里访问框架。 – pbush25