Вопрос: Как удалить эффекты перехода 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)];
}

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

Благодаря!


14


источник


Ответы:


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

tableView:didEndDisplayingCell:forRowAtIndexPath:

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


4



Если вам действительно нужно использовать 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's 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];
}

Кстати, поскольку вы хотите всегда перейти от «ничего» к вашему новому образу, не облегчит ли жизнь простое использование 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;
    }];
}

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


1



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

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


0



Попробуй это:

-(void)prepareForReuse {
   [super prepareForReuse];

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

}

0



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


0



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

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

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

Поэтому я повторил эмуляцию ошибки в моем коде, ниже приведены шаги 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];

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


-1