Tôi đã từng gặp vấn đề tương tự. Cảm ơn những người khác đã trả lời - Tôi đã có thể cùng nhau tìm ra giải pháp bằng cách sử dụng các phần của một số câu trả lời này.
Giải pháp của tôi là sử dụng swift 5
Vấn đề mà chúng tôi đang cố gắng giải quyết là chúng tôi có thể có hình ảnh với các tỷ lệ khung hình khác nhau trong TableViewCell
s của chúng tôi nhưng chúng tôi muốn chúng hiển thị với độ rộng phù hợp. Tất nhiên, hình ảnh sẽ hiển thị không bị biến dạng và lấp đầy toàn bộ không gian. Trong trường hợp của tôi, tôi thấy ổn với một số "cắt xén" hình ảnh cao và gầy, vì vậy tôi đã sử dụng chế độ nội dung.scaleAspectFill
Để làm điều này, tôi đã tạo một lớp con tùy chỉnh của UITableViewCell
. Trong trường hợp của tôi, tôi đã đặt tên cho nó StoryTableViewCell
. Toàn bộ lớp học được dán bên dưới, với các nhận xét nội tuyến.
Cách tiếp cận này phù hợp với tôi khi sử dụng Chế độ xem Phụ kiện tùy chỉnh và các nhãn văn bản dài. Đây là hình ảnh của kết quả cuối cùng:
Chế độ xem bảng được kết xuất với chiều rộng hình ảnh nhất quán
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
hình ảnh sẽ được căn giữa.