J'ai eu le même problème. Merci à tous ceux qui ont répondu - j'ai pu trouver une solution en utilisant des parties de plusieurs de ces réponses.
Ma solution utilise Swift 5
Le problème que nous essayons de résoudre est que nous pouvons avoir des images avec des proportions différentes dans nos TableViewCell
s mais nous voulons qu'elles soient rendues avec des largeurs cohérentes. Les images doivent, bien sûr, être rendues sans distorsion et remplir tout l'espace. Dans mon cas, je me débrouillais bien avec certains "recadrages" d'images hautes et maigres, j'ai donc utilisé le mode contenu.scaleAspectFill
Pour ce faire, j'ai créé une sous-classe personnalisée de UITableViewCell
. Dans mon cas, je l'ai nommé StoryTableViewCell
. La classe entière est collée ci-dessous, avec des commentaires en ligne.
Cette approche a fonctionné pour moi lorsque j'utilise également une vue accessoire personnalisée et de longues étiquettes de texte. Voici une image du résultat final:
Vue de tableau rendue avec une largeur d'image constante
class StoryTableViewCell: UITableViewCell {
override func layoutSubviews() {
super.layoutSubviews()
// ==== Step 1 ====
// ensure we have an image
guard let imageView = self.imageView else {return}
// create a variable for the desired image width
let desiredWidth:CGFloat = 70;
// get the width of the image currently rendered in the cell
let currentImageWidth = imageView.frame.size.width;
// grab the width of the entire cell's contents, to be used later
let contentWidth = self.contentView.bounds.width
// ==== Step 2 ====
// only update the image's width if the current image width isn't what we want it to be
if (currentImageWidth != desiredWidth) {
//calculate the difference in width
let widthDifference = currentImageWidth - desiredWidth;
// ==== Step 3 ====
// Update the image's frame,
// maintaining it's original x and y values, but with a new width
self.imageView?.frame = CGRect(imageView.frame.origin.x,
imageView.frame.origin.y,
desiredWidth,
imageView.frame.size.height);
// ==== Step 4 ====
// If there is a texst label, we want to move it's x position to
// ensure it isn't overlapping with the image, and that it has proper spacing with the image
if let textLabel = self.textLabel
{
let originalFrame = self.textLabel?.frame
// the new X position for the label is just the original position,
// minus the difference in the image's width
let newX = textLabel.frame.origin.x - widthDifference
self.textLabel?.frame = CGRect(newX,
textLabel.frame.origin.y,
contentWidth - newX,
textLabel.frame.size.height);
print("textLabel info: Original =\(originalFrame!)", "updated=\(self.textLabel!.frame)")
}
// ==== Step 4 ====
// If there is a detail text label, do the same as step 3
if let detailTextLabel = self.detailTextLabel {
let originalFrame = self.detailTextLabel?.frame
let newX = detailTextLabel.frame.origin.x-widthDifference
self.detailTextLabel?.frame = CGRect(x: newX,
y: detailTextLabel.frame.origin.y,
width: contentWidth - newX,
height: detailTextLabel.frame.size.height);
print("detailLabel info: Original =\(originalFrame!)", "updated=\(self.detailTextLabel!.frame)")
}
// ==== Step 5 ====
// Set the image's content modoe to scaleAspectFill so it takes up the entire view, but doesn't get distorted
self.imageView?.contentMode = .scaleAspectFill;
}
}
}
self.imageView.bounds
l'image sera centrée.