我正在尝试通过使用 UIImageView 并在视图首次呈现给用户时将其框架设置在与我的 UITabBarItem 相同的框架中来为 UITabBar 项目设置动画。在另一个项目中,它在 viewDidAppear 上运行良好,日志显示该框架与我原始项目中的框架位于同一框架中(我有 5 个项目,第 5 个项目始终位于 333, 1)。在我的原始项目中,viewDidAppear 将返回 0, 0 并在 viewDidLayoutSubviews 上返回 333, 1。我将代码移动到 viewDidLayoutSubviews 上进行动画处理,发现它被调用了两次,并在第一次调用时返回 2 个值,0、0,在第二次调用时返回 333、1。
有没有办法在 viewDidLayoutSubviews 完成第二次调用后启动动画?
我尝试在 viewWillAppear、viewDidAppear 和 viewDidLayoutSubviews 中移动动画代码。
viewWillAppear 和 viewDidAppear 导致转换后的 CGPoint 作为标签栏的原始 CGPoint (0, 617)。
viewDidLayoutSubviews 在第一次调用时将转换后的 CGPoint 作为 Tab Bar (0, 687) 的新 CGPoint 并开始动画,并在第二次调用时动画完成后的实际帧。
以下代码是我的 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 个位置)。这适用于不同的项目,但我当前的项目似乎以不同的方式处理渲染。