Cách thực hiện việc này là sửa đổi nội dungRect của lớp UIImageView. Đoạn mã sau từ dự án của tôi (lớp con của UIImageView) giả định scaleToFill và bù đắp hình ảnh sao cho nó căn chỉnh trên cùng, dưới cùng, trái hoặc phải thay vì căn giữa mặc định. Đối với aspectFit sẽ là một giải pháp tương tự.
typedef NS_OPTIONS(NSUInteger, AHTImageAlignmentMode) {
AHTImageAlignmentModeCenter = 0,
AHTImageAlignmentModeLeft = 1 << 0,
AHTImageAlignmentModeRight = 1 << 1,
AHTImageAlignmentModeTop = 1 << 2,
AHTImageAlignmentModeBottom = 1 << 3,
AHTImageAlignmentModeDefault = AHTImageAlignmentModeCenter,
};
- (void)updateImageViewContentsRect {
CGRect imageViewContentsRect = CGRectMake(0, 0, 1, 1);
if (self.image.size.height > 0 && self.bounds.size.height > 0) {
CGRect imageViewBounds = self.bounds;
CGSize imageSize = self.image.size;
CGFloat imageViewFactor = imageViewBounds.size.width/imageViewBounds.size.height;
CGFloat imageFactor = imageSize.width/imageSize.height;
if (imageFactor > imageViewFactor) {
//Image is wider than the view, so height will match
CGFloat scaledImageWidth = imageViewBounds.size.height * imageFactor;
CGFloat xOffset = 0.0;
if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeLeft)) {
xOffset = -(scaledImageWidth - imageViewBounds.size.width)/2;
} else if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeRight)) {
xOffset = (scaledImageWidth - imageViewBounds.size.width)/2;
}
imageViewContentsRect.origin.x = (xOffset/scaledImageWidth);
} else if (imageFactor < imageViewFactor) {
CGFloat scaledImageHeight = imageViewBounds.size.width/imageFactor;
CGFloat yOffset = 0.0;
if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeTop)) {
yOffset = -(scaledImageHeight - imageViewBounds.size.height)/2;
} else if (BM_CONTAINS_BIT(self.alignmentMode, AHTImageAlignmentModeBottom)) {
yOffset = (scaledImageHeight - imageViewBounds.size.height)/2;
}
imageViewContentsRect.origin.y = (yOffset/scaledImageHeight);
}
}
self.layer.contentsRect = imageViewContentsRect;
}
Nguồn
2016-07-21 11:07:03
Tôi biết điều này là cũ nhưng giải pháp này là tuyệt vời cho những người tìm kiếm chủ đề này như tôi đã làm: https://github.com/reydanro/UIImageViewAligned – tommybananas