viewDidLayoutSubviews вызывается дважды и неправильно конвертирует pointPoint при первом рендеринге - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь анимировать элементы UITabBar с помощью UIImageView и устанавливаю его кадр в том же кадре, что и мой UITabBarItem, когда представление впервые отображается для пользователя.В другом проекте он отлично работает с viewDidAppear, логи показывают, что кадр находится в том же кадре, что и в моем исходном проекте (у меня 5 элементов, а 5-й элемент всегда на 333, 1).В моем исходном проекте viewDidAppear вернет 0, 0 и вернет 333, 1 для viewDidLayoutSubviews.Я переместил код для анимации в 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 больше не используется в этом методе.

Я ожидаюct выходной UIImage должен быть поверх того, где находится предполагаемое изображение UITabBarItem (в данном случае, 5-ая позиция в UITabBar).Это сработало в другом проекте, но мой текущий проект, кажется, обрабатывает рендеринг по-другому.

...