2011-07-28 43 views
25

Thực sự kỳ quặc để bị kẹt trên nhưng thật lạ lùng.iPhone: Nhận được kích thước của hình ảnh sau AspectFt

Bạn có một hình ảnh imageView. Bạn có kích thước mà imageView xuống và sau đó nói với nó để sử dụng UIViewContentModeScaleAspectFit. do đó, imageView của bạn có thể là 300 x 200 nhưng hình ảnh được chia tỷ lệ của bạn có thể là 300 x 118 hoặc 228 x 200 vì số aspectfit.

Làm cách nào để bạn nhận được kích thước của hình ảnh thực tế?
imageView.image.size là kích thước của hình ảnh gốc.
imageview.frame là khung của imageview không phải là hình ảnh được chứa.
imageview.contentstretch không hoạt động hoặc

+0

Kiểm tra giải pháp một dòng này. http://stackoverflow.com/a/43114960/2071021 –

Trả lời

36

tôi đã viết một loại nhanh chóng trên UIImageView để đạt được điều đó:

(.h)

@interface UIImageView (additions) 
- (CGSize)imageScale; 
@end 

(.m)

@implementation UIImageView (additions) 
- (CGSize)imageScale { 
    CGFloat sx = self.frame.size.width/self.image.size.width; 
    CGFloat sy = self.frame.size.height/self.image.size.height; 
    CGFloat s = 1.0; 
    switch (self.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); 
    } 
} 
@end 

Multiply kích thước hình ảnh ban đầu bằng cách quy mô nhất định, và bạn sẽ nhận được kích thước hình ảnh hiển thị thực tế của bạn.

+1

Nếu bạn quan tâm, tôi cũng có một đoạn mã trên đầu trang đó sẽ cung cấp cho bạn CGRect thực tế của hình ảnh bên trong UIImageView của bạn, bất kể contentMode hoặc tỷ lệ. – Cyrille

+2

Cảnh báo, mã này sẽ bị ngắt nếu không đặt hình ảnh. Thêm dòng 'if (self.image == nil) trả về CGSizeMake (1, 1);' là dòng đầu tiên của việc thực hiện 'imageScale'. – Cyrille

+8

Tôi muốn được quan tâm đến phương pháp của bạn để có được CGRect thực tế của một hình ảnh trong UIImageView. –

11

cũng .. bạn phải thực hiện một số phép tính. bạn có kích thước của hình ảnh gốc và bạn có kích thước của hình ảnh xem .. vì vậy bạn có thể tính toán liệu nó sẽ được thay đổi kích thước theo chiều cao hoặc chiều rộng.

nếu bạn xem hình ảnh là 300x200 và hình ảnh là 1024x768 bạn có thể tính toán đó là yếu tố hạn chế

300/1024 = 0.29296875 
200/768 = 0.260416667 

nên chiều cao là yếu tố hạn chế ... hình ảnh sẽ là:

267x200

+0

cảm ơn bạn, yêu thích loại câu trả lời này hơn là dán bản sao chung – Ben

+0

cảm ơn, đó là câu trả lời tôi đang tìm kiếm! –

5

Phiên bản Swift của câu trả lời được chấp nhận:

extension UIImageView { 
var imageScale: CGSize { 
    let sx = Double(self.frame.size.width/self.image!.size.width) 
    let sy = Double(self.frame.size.height/self.image!.size.height) 
    var s = 1.0 
    switch (self.contentMode) { 
    case .scaleAspectFit: 
     s = fmin(sx, sy) 
     return CGSize (width: s, height: s) 

    case .scaleAspectFill: 
     s = fmax(sx, sy) 
     return CGSize(width:s, height:s) 

    case .scaleToFill: 
     return CGSize(width:sx, height:sy) 

    default: 
     return CGSize(width:s, height:s) 
    } 
    } 
} 
4

Chỉ cần thêm một chút an ninh trên mã Individual11. Gọi imageScale trên một imageView mà không có hình ảnh thực sự sẽ bị lỗi.

extension UIImageView { 
    var imageScale: CGSize { 

     if let image = self.image { 
      let sx = Double(self.frame.size.width/image.size.width) 
      let sy = Double(self.frame.size.height/image.size.height) 
      var s = 1.0 
      switch (self.contentMode) { 
      case .scaleAspectFit: 
       s = fmin(sx, sy) 
       return CGSize (width: s, height: s) 

      case .scaleAspectFill: 
       s = fmax(sx, sy) 
       return CGSize(width:s, height:s) 

      case .scaleToFill: 
       return CGSize(width:sx, height:sy) 

      default: 
       return CGSize(width:s, height:s) 
      } 
     } 

     return CGSize.zero 
    } 
} 
Các vấn đề liên quan