2016-12-20 2 views
0

Ich verwende eine collectionview innerhalb einer tableview zum Anzeigen von Bildern, die asynchron heruntergeladen werden. Was ich tun muss, ist, diese Bilder zu zeigen, ohne zu quetschen. Ich halte die Höhe der collectionview Konstante konstant und berechne die Größe der Bilder nach dem Download. Ich behalte Content-Modus der UIIamgeView UIViewContentModeScaleAspectFit. Dies habe ich getan, um mein beabsichtigtes Ergebnis zu erreichen.Wie kann man verhindern, dass die Bildqualität durch den UImageView-Content-Mode UIViewContentModeScaleAspectFit, der die Höhe konstant hält, verloren geht?

- (void)configureMediaCell:(MediaContainerViewCell *)weakCell withMediaItem:(MSZWallPostMedia *)mediaItem withDownloadImage:(UIImage *)image{ 
    if (mediaItem.isFrameSet == NO) { 
     weakCell.isFrameSet = YES; 
     weakCell.cellImageView.image = image; 
     weakCell.cellImageView.contentMode = UIViewContentModeScaleAspectFit; 
     CGRect frame = weakCell.cellImageView.frame; 

     //Image Scaling 
     CGSize scaleSize = [self imageScale:weakCell.cellImageView]; 

     scaleSize.width = scaleSize.width * image.size.width; 
     scaleSize.height = scaleSize.height * image.size.height; 
     frame.size.width = scaleSize.width; 
     frame.size.height = scaleSize.height; 
     weakCell.cellImageView.frame = frame; 
     mediaItem.frame = frame; 
     mediaItem.isFrameSet = YES; 
     [weakCell.activityIndicatorView stopAnimating]; 
     [self.collectionView reloadItemsAtIndexPaths:@[weakCell.indexPath]]; 
    } else { 
     [weakCell.activityIndicatorView stopAnimating]; 
     weakCell.cellImageView.image = image; 
     weakCell.cellImageView.frame = mediaItem.frame; 
     weakCell.cellImageView.contentMode = UIViewContentModeScaleAspectFit; 
    } 
} 

Für Bildskalierung:

- (CGSize)imageScale : (UIImageView *)imageView { 
    CGFloat sx = imageView.frame.size.width/imageView.image.size.width; 
    CGFloat sy = imageView.frame.size.height/imageView.image.size.height; 
    CGFloat s = 1.0; 
    switch (imageView.contentMode) { 
     case UIViewContentModeScaleAspectFit: 
      s = fminf(sx, sy); 
      return CGSizeMake(s, s); 
      break; 

     case UIViewContentModeScaleAspectFill: 
      s = fmaxf(sx, sy); 
      return CGSizeMake(s, s); 
      break; 

     case UIViewContentModeScaleToFill: 
      return CGSizeMake(sx, sy); 

     default: 
      return CGSizeMake(s, s); 
    } 
} 

Das Problem bei diesem Ansatz ist, dass ich die richtigen Breiten und Höhen erhalten, aber einige Bilder sind kleiner dargestellt, das liegt auf der Hand, weil ich Aspectfit Eigenschaft Imageview bin mit der wird im angehängten Bildschirm angezeigt.

Images

Jede Hilfe in Bezug auf diese würde geschätzt. Ich muss Bilder behalten, da sie Höhe collectionviewitem feste und variable Breite behalten.

Antwort

0

Wenn ich dich richtig verstehe. Sie müssen nur das Bild Breite/Höhe-Verhältnis finden und gewünschte Höhe multiplizieren.

Beispiel:?

Bild

width = 30, h = 10


Zelle

width =, Höhe = 7

Ratio = 30/10

Zellenbreite = 7 · (30/10) = 21

Zellgrße (21,7)


werden wird Hoffe das ist, was du meintest. Sie werden jedoch mit dem Problem konfrontiert, wenn das Bild kleiner als die Zelle ist. Dann könnte es verzerrt werden.

Verwandte Themen