我试图通过使用UIImageView为UITabBar项设置动画,并在视图首次呈现给用户时将其帧设置为与UITabBarItem相同的帧。在另一个项目中,它在viewDidAppear上运行良好,日志显示该框架与原始项目中的框架处于同一框架(我有5个项目,第5个项目始终为333,1)。在我的原始项目中,viewDidAppear将在viewDidLayoutSubviews上返回0、0并返回333、1。我将代码移到viewDidLayoutSubviews上进行动画处理,发现它被调用了两次,并返回2个值,第一次调用返回0、0,第二次调用返回333、1。
在第二次调用完成viewDidLayoutSubviews之后,是否可以启动动画?
我尝试在viewWillAppear,viewDidAppear和viewDidLayoutSubviews中移动动画代码。
viewWillAppear和viewDidAppear导致转换后的CGPoint作为选项卡栏的原始CGPoint(0、617)。
viewDidLayoutSubviews导致转换后的CGPoint作为第一次调用时选项卡栏的新CGPoint(0、687),并开始动画,以及动画在第二次调用完成后的实际帧。
以下代码是我的viewDidLayoutSubviews上的内容:
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
if(self.fromTabBar) {
NSInteger index = 5;
UIImageView *imageView = [[self.tabBar.subviews lastObject].subviews firstObject];
[self startAnimation:imageView withTag:index];
}
}
以下代码用于startAnimation:withTag::
-(void)startAnimation:(UIImageView *)imageView withTag:(NSInteger)tag {
CGPoint point = [imageView.superview convertPoint:imageView.frame.origin toView:self.view];
UIImageView *hexagon = [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"vector-profile"]];
[hexagon setFrame:CGRectMake(point.x, point.y, imageView.frame.size.width, imageView.frame.size.height)];
hexagon.alpha = 0;
[self.view addSubview:hexagon];
[UIView animateWithDuration:0.5 animations:^{
imageView.transform = CGAffineTransformMakeScale(0.45, 0.45);
} completion:^(BOOL finished) {
[UIView animateWithDuration:0.5 animations:^{
imageView.alpha = 0;
hexagon.alpha = 1;
} completion:nil];
}];
}
此方法不再使用tag参数。
我希望输出的UIImage在预期的UITabBarItem图像的顶部(在这种情况下,在UITabBar中的第5个位置)。这在另一个项目上起作用,但是我当前的项目似乎对渲染的处理方式不同。