2014-03-27 61 views
1

使用AFNetworking 2.0的方法setImageWithUrl,我在位於UITableViewCell中的imageView中設置圖像。當顯示的圖像首次下載並設置時,它工作正常。但是,如果圖像在設置時在本地可用(已被緩存),則在顯示圖像之前會出現快速白色閃爍。setImageWithUrl顯示緩存圖像時閃爍白色

你知道如何避免這種情況嗎?

重現步驟:

  1. 集合圖像(圖像將被緩存)
  2. 關閉應用
  3. 開始應用
  4. 集(現在緩存)圖像

代碼設置圖像:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 

    myCell *cell = (myCell *)[tableView dequeueReusableCellWithIdentifier:@"imageCell"]; 

    [cell.myImageView setImageWithURLRequest:[NSURLRequest requestWithURL:myImageUrl] placeholderImage:nil success:^(NSURLRequest *request, NSHTTPURLResponse *response, UIImage *image) { 
     cell.myImageView.image = image; 

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { 
     NSLog(@"Failed"); 
    }]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    return cell; 
} 

回答

7

如果任何人碰到了同樣的問題,這裏是我如何解決它:

在成功的塊,用

取代

cell.myImageView.image = image; 

if (request) { 
    [UIView transitionWithView:cell.myImageView 
         duration:0.8f 
         options:UIViewAnimationOptionTransitionCrossDissolve 
        animations:^{[cell.myImageView setImage:image];} 
        completion:NULL]; 
}else{ 
    [cell.myImageView setImageWithURL:myImageURL]; 
} 

Voilà,沒有更醜陋的閃爍!

致謝this answer爲我帶來了正確的軌道。

0

看來您的問題與單元重用有關,而與緩存問題有關。

當您的單元格被重用(當滾動UITableView或重新打開應用程序時),它們將持有對舊圖像的引用。當您將nil傳遞給placeholderImage參數時,AFNetworking不會重置您的圖像。這裏是source code。所以新圖像設置在success塊中。但是這個區塊可能會在稍微網絡延遲後使圖像閃爍。順便說一句,您可能會省略成功塊,因此AFNetworking將set the image by itself

如果您沒有placeHolder圖像,則應在設置myImageView.imagenil之前嘗試異步設置新圖像。

此外,你應該檢查dequeueReusableCellWithIdentifier:方法是否返回一個單元格,如果沒有,則創建一個新單元格。這可能會在UITableView首次創建時發生。

下面是一個例子:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    myCell *cell = (myCell *)[tableView dequeueReusableCellWithIdentifier:@"imageCell"]; 

    // Check if reused cell was returned. 
    // If not create a new one, otherwise, reset the state of the reused cell 
    if (!cell) { 
     cell = [[myCell alloc] init]; 
    } else { 
     cell.myImageView.image = nil; 
    } 

    [cell.myImageView 
     setImageWithURLRequest:[NSURLRequest requestWithURL:myImageUrl] 
     placeholderImage:nil 
     success:nil 
     failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error) { 
      NSLog(@"Failed"); 
     }]; 

    cell.selectionStyle = UITableViewCellSelectionStyleNone; 

    return cell; 
} 
+0

謝謝你這麼廣泛和快速的回​​復@smnh。不幸的是,這並沒有成功。我用你的代碼替換了我的代碼,但閃存仍然存在。不過,你可能已經指出了我正確的方向。 – Leverin

+0

我試着設置一個placeholderimage來查看這個行爲是否會改變。仍然是「閃光」;佔位符圖像在顯示緩存圖像之前顯示0.X秒。我想我可以嘗試添加淡入淡出效果。 – Leverin

+0

是否可以將您的'myImageView.backgroundColor'設置爲白色?或者,也許在圖像未設置時閃爍的myImageView下方有一個白色視圖? – smnh