2017-05-31 1 views
0

Ich benutze SDWebImage, um Bilder, die ich in meine TableViewCells geladen habe, zu laden und zwischenzuspeichern. Ich möchte die Größe der Bilder ändern, um eine bessere Bildlaufleistung zu erzielen, und habe eine Größenänderungsfunktion als Erweiterung für UIImageView geschrieben, die die Größe der Bilder auf die Größe der Bildansicht anpasst. Nach einer Lösung suchend, fand ich die SDWebImageManager Funktion, die verwendet werden kann, um ein Bild vor dem Zwischenspeichern zu ändern, das einzige Problem ist, dass der Parameter ein UIImage ist, also kann ich die Größe nicht ändern, um das ImageView darin zu passen. Ich hoffe Sie Leute haben was ich meine. So mache ich es im Moment, was für die Performance etwas schlecht ist, da es bei jeder Anzeige der Zelle in der Größe geändert wird. Größe ist natürlich die Größe des ImageView.Wie SDWebImage vor dem Cache geändert wird, unter Berücksichtigung der Größe von UIImageView

cell.firstImage.sd_setImage(with: URL(string: image0Uri), completed: { (img, err, cache, url) in 
        cell.firstImage.resize(toSize: size) 
       }) 

Antwort

0

Dies ist ein wenig komplizierter als nur 1 Zeile Code, müssen Sie unter Umständen das Bild manuell zu laden, dann ist es die Größe, es dann mit Ihrem eigenen Schlüssel Cache speichert, dann holen die untere Reso mit Ihrem Schlüssel

Vielleicht so etwas wie folgt aus:

SDImageCache.shared().queryCacheOperation(forKey: "KEY", done: { (image, data, type) in 
     if let image = image { 
      self.firstImage.image = image 
     } else { 
      if let imgUrl = url { 
       SDWebImageManager.shared().loadImage(with: URL(string: imgUrl), options: [], progress: nil) { (image, data, error, type, done, url) in 
        image.resize(toSize: size) 
        self.firstImage.image = image 
        SDImageCache.shared().store(image, forKey: "KEY", completion: nil) 
       }) 
      } else { 
       self.firstImage.image = UIImage(named: "img_default") 
      } 
     } 
    }) 
+0

Das dachte ich mir, aber ich war mir nicht sicher, wie ich es mit SDWebImage implementieren könnte. Ich werde versuchen, Ihre Version zu sein der Richtige, vielen Dank! –

+0

Sorry für die späte Antwort, aber ich habe es endlich ausprobiert und es scheint perfekt zu funktionieren :) Vielen Dank! –

0

Sie können die Größe des Bildes ändern, nachdem Sie es bekommen haben. Übergeben Sie einfach Bild und die Höhe und Breite des Bildes.

[cell.imgview sd_setImageWithURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@",Image_URL2]] placeholderImage:[UIImage imageNamed:@"imagename"] completed:^(UIImage image, NSError error, SDImageCacheType cacheType, NSURL *imageURL) { 
       if (image) { 
        cell.imgview.image=[Utility compressImageDynamic:image hight:(360 [UIScreen mainScreen].bounds.size.width)/320 width:(360 [UIScreen mainScreen].bounds.size.width)/320]; 

       } 
       else{ 

       } 
      }]; 

Unten ist die Funktion für Bildgröße.

-(UIImage)compressImageDynamic:(UIImage)image hight:(float)x width:(float)y{ 
float actualHeight = image.size.height; 
float actualWidth = image.size.width; 
float maxHeight = x; 
float maxWidth = y; 
float imgRatio = actualWidth/actualHeight; 
float maxRatio = maxWidth/maxHeight; 
float compressionQuality = 1;//50 percent compression 

if (actualHeight > maxHeight || actualWidth > maxWidth){ 
    if(imgRatio < maxRatio){ 
     //adjust width according to maxHeight 
     imgRatio = maxHeight/actualHeight; 
     actualWidth = imgRatio * actualWidth; 
     actualHeight = maxHeight; 
    } 
    else if(imgRatio > maxRatio){ 
     //adjust height according to maxWidth 
     imgRatio = maxWidth/actualWidth; 
     actualHeight = imgRatio * actualHeight; 
     actualWidth = maxWidth; 
    } 
    else{ 
     actualHeight = maxHeight; 
     actualWidth = maxWidth; 
    } 
}else{ 
    actualHeight = maxHeight; 
    actualWidth = maxWidth; 
    compressionQuality = 1; 
} 

CGRect rect = CGRectMake(0.0, 0.0, actualWidth, actualHeight); 
UIGraphicsBeginImageContext(rect.size); 
[image drawInRect:rect]; 
UIImage *img = UIGraphicsGetImageFromCurrentImageContext(); 
NSData *imageData = UIImageJPEGRepresentation(img, compressionQuality); 
UIGraphicsEndImageContext(); 

return [UIImage imageWithData:imageData]; 

}

+0

das ist fast genau das, was ich schon tue, ist das Problem, dass das Originalbild zwischengespeichert wird, nicht wahr? Ich möchte das Bild in der Größe zwischenspeichern, also muss ich die Größenänderungsfunktion nicht immer wieder aufrufen –

Verwandte Themen