viewDidLayoutSubviews被调用两次,并且convertPoint在第一次渲染时无法正确转换

时间:2019-06-25 01:44:21

标签: ios objective-c autolayout tabbar viewdidlayoutsubviews

我试图通过使用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个位置)。这在另一个项目上起作用,但是我当前的项目似乎对渲染的处理方式不同。

0 个答案:

没有答案