2012-10-17 11 views
9

mogę pobrać wiele obrazów z internetu, i są wszelkiego rodzaju rozmiarach - mogą być duże, małe, etc ..przetwarzanie zdjęć SDWebImage przed buforowania

Więc mogę zmieniać ich rozmiar, kiedy wyświetlać je w komórka, ale jest to nieefektywne. Lepiej jest zmienić ich rozmiar po pobraniu SDWebImage i buforowaniu ich rozmiaru, zamiast przechowywać duże obrazy na dysku i zmieniać ich rozmiar dla każdej komórki.

Jak mogę to zrobić z SDWebImage, czy muszę trochę zhakować na zajęciach?

Odpowiedz

4

Miałem ten sam problem co Ty i najpierw próbowałem poprawić SDWebImage, ale skończyło się budowaniem mojego własnego komponentu, który rozwiązał problem. Możesz rzucić okiem tutaj: https://github.com/adig/RemoteImageView

+0

To jest świetne! Dobra robota w bibliotece. Występują pewne niedogodności, takie jak ponowne ładowanie obrazów przy każdej wiadomości reloadData lub obrazy pojawiające się ponownie na każdym przewinięciu tabeli. Możesz rzucić okiem na to. Dzięki i gratulacje! – Devfly

+0

Dzięki za opinię. Jeśli odnosisz się do sekwencji animacji po wczytaniu obrazu, możesz wyłączyć to za pomocą właściwości animacji. – adig

+0

Tak, świetnie, już to zaimplementowałem. – Devfly

24

Programista SDWebImage Olivier Poitrey odpowiedział na to pytanie dla mnie here.

Trzeba wdrożyć protokół SDWebImageManagerDelegate a następnie ustawić go jako delegata udostępnionej menedżera tak:

SDWebImageManager.sharedManager.delegate = self; 

using the imageManager:transformDownloadedImage:withURL: instance method. 

More information.

Pracował idealnie dla mnie.

+1

To jest niesamowite! Dziękuję bardzo za skierowanie mnie we właściwy kierunek. – kleo

+0

Niestety nie udało się. Korzystam z metody zastępczej dla UllmageView + WebCache.h sd_setImageWithURL: (NSURL *) url placeholderImage: (UIImage *) dla obrazu każdej komórki. Co powinienem zrobić, czy możesz powiedzieć w kategoriach laika? –

0

SDWebImage 3.8.2

przypadku korzystania kategorię UIImageView sd_setImageWithURL. I stworzyli kolejną kategorię UIImageView (rozszerzenie)

func modifiedImageFromUrl(url: NSURL?) { 
    self.sd_setImageWithURL(url) { (image, error, cacheType, url) in 
     if cacheType == SDImageCacheType.None && image != nil { 
      dispatch_async(dispatch_get_global_queue(QOS_CLASS_USER_INITIATED, 0)) { 
       let modifiedImage = // modify image as you want 

       dispatch_async(dispatch_get_main_queue()) { 
        SDWebImageManager.sharedManager().saveImageToCache(modifiedImage, forURL: url) 

        self.image = modifiedImage 
       } 
      } 
     } 
    } 
} 
0

ekspansja na odpowiedź Maestro w Swift 3:

myImageView.sd_setImage(with: imageUrl){ (image, error, cacheType, url) in 
    guard let image = image, cacheType == .none else { return } 

    DispatchQueue.global(qos: .userInitiated).async { 
     let modifiedImage = myImageProcessor(image) 
     SDWebImageManager.shared().saveImage(toCache: modifiedImage, for: imageUrl) 
     DispatchQueue.main.async { 
      myImageView.image = modifiedImage 
      myImageView.setNeedsDisplay() 
     } 
    } 
} 
Powiązane problemy