Изображение UIImageView не удаляется, если в uicollectionviewcell установлено значение nil

По сути, я делаю снимок представления, применяю к нему размытие, а затем использую его в качестве размытого наложения uiview в повторно используемых ячейках представления коллекции в простом представлении uicollectionview.

// Capture Screen for blurr.
-(UIImage *) captureScreen:(CGRect)frame
{
    CGRect grabRect = frame;

    //for retina displays
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
    {
        UIGraphicsBeginImageContextWithOptions(grabRect.size, NO, [UIScreen mainScreen].scale);
    }
    else
    {
        UIGraphicsBeginImageContext(grabRect.size);
    }

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextTranslateCTM(ctx, -grabRect.origin.x, -grabRect.origin.y);
    [self.contentView.layer renderInContext:ctx];
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    viewImage = [viewImage applyBlurWithRadius:1.8f tintColor:nil saturationDeltaFactor:1.0 maskImage:viewImage atFrame:self.imageView.frame];

    return viewImage;
}

// Set blurred image as image view image.
- (void) updateBlur
{
    UIImage* infoViewImage = [self captureScreen:self.infoView.frame];
    self.infoImageView.image = infoViewImage;
}

// Prepare for reuse.
- (void) prepareForReuse
{
    self.infoImageView.image = nil;

}

Обратите внимание, что uiimageview создается и добавляется как подпредставление к элементу contentView ячейки при инициализации. Всякий раз, когда я прокручиваю медленно, это работает нормально. Если я быстро прокручиваю, изображение будет удаляться из представления изображения только иногда... Я не совсем понимаю, почему это происходит. До сих пор я пробовал несколько решений, даже удаляя весь uiimageview из супервизора и каждый раз повторно инициализируя/повторно добавляя его в качестве подвида, но это действие имеет ту же проблему. Пожалуйста помоги!


person Shawn    schedule 28.03.2014    source источник
comment
Как вы смогли определить, что изображение удаляется из представления только иногда? Метод prepareForReuse вызывается только тогда, когда ячейка берется из очереди повторного использования в cellForRowAtIndexPath, и, предположительно, в этот момент вы замените изображение другим.   -  person user3386109    schedule 28.03.2014
comment
Я могу сказать, наблюдая за приложением. Существует еще один вид изображения, за которым есть другое изображение. Иногда изображение, которое, скорее всего, раньше было в ячейке представления коллекции, оказывается в моем представлении наложенного изображения.   -  person Shawn    schedule 28.03.2014
comment
Но разве вы не всегда вызываете updateBlur в cellForRowAtIndexPath? Я хочу сказать, что установка .image = nil не имеет никакого эффекта, если вы впоследствии установите .image = infoViewImage в cellForRowAtIndexPath. С другой стороны, если вы установите .image = nil, но не установите .image = infoViewImage, что тогда?   -  person user3386109    schedule 28.03.2014
comment
Изображение передается асинхронно от контроллера в cellforindexpath.   -  person Shawn    schedule 28.03.2014
comment
Ясно, ну это совсем другая банка червей. Не зная намного больше о структуре вашей ячейки и о том, как cellForItemAtIndexPath настраивает ячейки, я не думаю, что смогу чем-то помочь.   -  person user3386109    schedule 28.03.2014
comment
Такая же проблема, нашли решение?   -  person Rodrigo Ruiz    schedule 18.08.2014
comment
Ага, здесь так же. Любое решение? Я также использую AFNetworking для асинхронного заполнения изображения, интересно, имеет ли это какое-то отношение к нему. AFImageRequestOperation imageRequestOperationWithRequest   -  person Jarson    schedule 22.08.2014
comment
Я так и не нашел решения.   -  person Shawn    schedule 23.08.2014


Ответы (1)


Проблема в том, что повторно используемые ячейки представления коллекции... можно использовать повторно. Вам нужно реализовать collectionView:cellForItemAtIndexPath: для работы с каждой ячейкой, которую она когда-либо передавала, без каких-либо предположений о том, могли ли вы ранее добавить к ней подпредставление.

person matt    schedule 28.03.2014
comment
Я не задаю вопрос о том, как настроить представление коллекции. Предположение, которое я прошу вас сделать, заключается в том, что они настроены как повторно используемые ячейки представления коллекции. В этом случае мы смотрим на UICollectionViewCell, у которого есть UIImageView, который устанавливает изображение при повторном использовании, а затем удаляет это изображение, когда оно подготовлено для повторного использования. Проблема в том, что изображение не всегда удаляется при быстрой прокрутке в функции подготовки к повторному использованию, предоставляемой uicollectionviewcell. - person Shawn; 28.03.2014
comment
Да, и я предполагаю, что prepareForReuse может быть неподходящим местом для этого и что вам следует попробовать сделать это в collectionView:cellForItemAtIndexPath:. По крайней мере, попробуйте. - person matt; 28.03.2014