0

我正在尝试通过使用 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 个位置)。这适用于不同的项目,但我当前的项目似乎以不同的方式处理渲染。

4

0 回答 0