2012-06-14 21 views
34

Dường như aspect fit căn chỉnh hình ảnh xuống cuối khung theo mặc định. Có cách nào để ghi ghi đè căn chỉnh trong khi vẫn giữ nguyên aspect fit không?Chế độ UIImage phù hợp và căn chỉnh lên trên cùng

** EDIT **

câu hỏi này xảy ra trước bố trí tự động. Trên thực tế, bố cục tự động đã được tiết lộ trong WWDC 2012 cùng tuần câu hỏi này được yêu cầu

+3

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

Trả lời

21

Tóm lại, bạn không thể thực hiện việc này với UIImageView.

Một giải pháp là phân lớp UIView chứa UIImageView và thay đổi khung của nó theo kích thước hình ảnh. Ví dụ: bạn có thể tìm thấy một phiên bản here.

+0

Nếu bạn có thể ghi đè lên UIImageView (như tôi làm dưới đây) bạn có thể làm điều đó trong một shot –

+1

Không hoàn toàn tác dụng tương tự OP cần thiết. – Mundi

-2

Nếu bạn có thể phân loại UIImageView, thì bạn chỉ có thể ghi đè lên số image var.

override var image: UIImage? { 
    didSet { 
     self.sizeToFit() 
    } 
} 

Trong mục tiêu-C bạn có thể làm điều tương tự bằng cách ghi đè công cụ đặt.

0

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; 
} 
0

tôi giải quyết natively này trong giao diện Builder bằng cách thiết lập một hạn chế về chiều cao của UIImageView, vì hình ảnh sẽ luôn luôn được 'đẩy' lên khi hình ảnh lớn hơn kích thước màn hình.

Cụ thể hơn, tôi đặt UIImageView có cùng chiều cao với Chế độ xem trong (qua giới hạn chiều cao), sau đó định vị UIImageView với các hạn chế khoảng cách trong IB. Điều này dẫn đến UIImageView có một 'Aspect Fit' mà vẫn tôn trọng ràng buộc khoảng cách đầu tôi đặt trong IB.

1

Tôi gặp sự cố tương tự. Cách đơn giản nhất là tạo lớp con của UIImageView. Tôi thêm cho lớp con 3 thuộc tính vì vậy bây giờ nó có thể được sử dụng easly mà không biết thực hiện nội bộ:

@property (nonatomic) LDImageVerticalAlignment imageVerticalAlignment; 
@property (nonatomic) LDImageHorizontalAlignment imageHorizontalAlignment; 
@property (nonatomic) LDImageContentMode imageContentMode; 

Bạn có thể kiểm tra xem nó ở đây: https://github.com/LucasssD/LDAlignmentImageView

3

Chỉ cần thiết lập đáy ưu tiên bố trí hạn chế IMAGExem để thấp nhất (tức là 250) và nó sẽ làm công việc

Các vấn đề liên quan