Как удалить эффекты перехода UIViewWithView

Используя приведенный ниже код, я успешно сделал свой UIImageView в своем изображении.

[UIView transitionWithView:myCell.myImageView duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    myCell.myImageView.image = myImage;
} completion:NULL];

Однако, когда ячейка повторно используется, мне нужно удалить это изображение. При повторном использовании оно отображает последнее изображение (показано до его повторного использования), а затем переходит к изображению, которое оно должно быть, вместо того, чтобы перейти от изображения к изображению, оно должно быть.

Что я пробовал:

-(void)prepareForReuse {
    [super prepareForReuse];

// More is obviously needed than just setting image to nil when using a transition
self.myImageView.image = nil;

[self.myImageView setNeedsDisplay];

// but I also tried removing all animations
[self.myImageView.layer removeAllAnimations];

// and I even tried removing the sublayers, but still no success.
[self.myImageView.layer.sublayers makeObjectsPerformSelector:@selector(removeFromSuperlayer)];
}

Любая помощь приветствуется, но, пожалуйста, не отвечайте, если вы не понимаете, в чем проблема. Комментарий вместо этого, чтобы я мог лучше объяснить, если это необходимо.

Спасибо!

Ответ 1

Спасибо за попытку, но ни один из ответов не устраняет проблему. Я также пробовал сочетания разных ответов. Кроме того, ни один из них не удовлетворяет "Ищет ответ, исходящий из достоверных и/или официальных источников". Я связался с технической поддержкой Apple Developer и отредактировал этот ответ, когда получаю от них ответ, чтобы он также помогал другим.

Ответ 2

Вы можете использовать обратный вызов

tableView:didEndDisplayingCell:forRowAtIndexPath:

Это называется так же, как ячейка выходит за пределы видимой области.
Попробуйте установить изображение на нуль или без изображения. Должен работать.

Ответ 3

Если вам действительно нужно использовать transitionWithView, то вот как это сделать.

Сначала добавьте следующую функцию в класс UITableViewCell:

-(void)fadeInImage
{
    self.ivPadlock.alpha = 0.0;

    //  Wait a fraction of a second...
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.1 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{

        //  ..then perform the "transitionWithView" on a seperate thread
        [UIView transitionWithView:self.ivPadlock duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{

            //  Replace our UIImageView image with an alternative image
            int i = rand()%5;
            switch (i)
            {
                case 0: self.ivPadlock.image = [UIImage imageNamed:@"icnPaperclip.png"]; break;
                case 1: self.ivPadlock.image = [UIImage imageNamed:@"icnSubscribed.png"]; break;
                case 2: self.ivPadlock.image = [UIImage imageNamed:@"icnGroups.png"]; break;
                case 3: self.ivPadlock.image = [UIImage imageNamed:@"icnCross.png"]; break;
                case 4: self.ivPadlock.image = [UIImage imageNamed:@"icnCamera.png"]; break;
            }
            self.ivPadlock.alpha = 1.0;

        } completion:NULL];
    });
}

И затем убедитесь, что эта функция вызывается всякий раз, когда ячейка создается или используется повторно:

- (void)awakeFromNib {
    // Initialization code
    [self fadeInImage];
}

-(void)prepareForReuse
{
    [super prepareForReuse];

    [self fadeInImage];
}

Btw, так как вы хотите всегда перейти от "ничего" в свой новый образ, не облегчит ли жизнь просто использовать animateWithDuration для увядания изображения с вашей ячейкой?

-(void)prepareForReuse
{
    [super prepareForReuse];

    self.ivPadlock.alpha = 0.0;
    self.ivPadlock.hidden = false;

    int i = rand()%5;
    switch (i)
    {
        case 0: self.ivPadlock.image = [UIImage imageNamed:@"icnPaperclip.png"]; break;
        case 1: self.ivPadlock.image = [UIImage imageNamed:@"icnSubscribed.png"]; break;
        case 2: self.ivPadlock.image = [UIImage imageNamed:@"icnGroups.png"]; break;
        case 3: self.ivPadlock.image = [UIImage imageNamed:@"icnCross.png"]; break;
        case 4: self.ivPadlock.image = [UIImage imageNamed:@"icnCamera.png"]; break;
    }

    [UIView animateWithDuration:2.0 animations:^{
        self.ivPadlock.alpha = 1.0;
    }];
}

Надеюсь, что это поможет.

Ответ 4

[UIView transitionWithView:myCell.myImageView duration:2.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
    myCell.myImageView.image = myImage;
} completion:^(BOOL finished) {
                        [self.myImageView.layer removeAllAnimations];   
                         }];

В моем случае я попытался решить мою проблему, аналогичную приведенному выше. Это может решить вашу проблему. Блок-объект (завершение), который должен быть выполнен, когда последовательность анимации завершается.

Ответ 5

Попробуйте следующее:

-(void)prepareForReuse {
   [super prepareForReuse];

   [CATransaction begin];
   [self.myImageView.layer removeAllAnimations];
   self.myImageView.image = nil;
   [CATransaction commit];

}

Ответ 6

  • Попробуйте использовать [self.myImageView.image setNeedsDisplay]; после того, как вы установили изображение в nil
  • Вам не нужно удалять подслои
  • Прежде чем вы покажете анимацию, в худшем случае, вы можете заставить просмотр изображения нулевым с помощью селекторного вызова из "Ячейка для строки по пути индекса"

Я хочу прокомментировать, но потерял свой старый логин и ответил вместо этого:)

изменить ----------------- последнее обновление ниже

Итак, я повторил эмуляцию ошибки в моем коде, ниже приведены шаги 1. Используйте табличное представление по умолчанию и попытайтесь исчезнуть в собственном представлении изображения (доступно в cell.imageView) 2. Любые нет. комбинаций с [UIView transitionWithView..] не помогло моему делу. Вместо этого я устанавливаю изображение (без переходов) в [cellForRowatIndexPath] и используется ниже, затухает в коде только в [willDisplayCell forRowAtIndexPath]

cell.imageView.alpha = 0;
[UIView beginAnimations:@"fade in" context:nil];
[UIView setAnimationDuration:1.0];
[UIView setAnimationDuration:2.0];
cell.imageView.alpha = 1.0;
[UIView commitAnimations];

и он работал нормально. Можете ли вы попробовать это один раз, может работать для вас.