2011-01-17 37 views
27

Tôi sửa đổi thuộc tính contentMode của UIImageView. Vì vậy, khung hình của tôi không bằng khung UIImageView. Vấn đề của tôi là làm thế nào để lấy lại khung hình của hình ảnh từ UIImageView.Cách lấy khung hình hiển thị từ UIImageView?

Ví dụ sau, hình chữ nhật màu cam là đường viền của UIImageView. Rõ ràng là khung hình ảnh không giống với UIImageView.

Figure 1

Trả lời

33

Nếu đó là UIViewContentModeScaleAspectFit, đó là một cái gì đó như thế này:

UIImageView *iv; // your image view 
CGSize imageSize = iv.image.size; 
CGFloat imageScale = fminf(CGRectGetWidth(iv.bounds)/imageSize.width, CGRectGetHeight(iv.bounds)/imageSize.height); 
CGSize scaledImageSize = CGSizeMake(imageSize.width*imageScale, imageSize.height*imageScale); 
CGRect imageFrame = CGRectMake(roundf(0.5f*(CGRectGetWidth(iv.bounds)-scaledImageSize.width)), roundf(0.5f*(CGRectGetHeight(iv.bounds)-scaledImageSize.height)), roundf(scaledImageSize.width), roundf(scaledImageSize.height)); 
+0

Vì vậy, UIImageView không có phương pháp trực tiếp để lấy khung ảnh. Nó cần phải được tính toán bằng tay, phải không? – AechoLiu

+0

Có. Trong thực tế, nó thậm chí không có phương pháp riêng mà trả về khung của hình ảnh dựa trên 'contentMode'. Tôi đoán các phép tính được thực hiện trong '-drawRect:' và '-sizeThatFits:'. – Costique

+0

Tôi đã thử sizeThatFits :, nó không thể truy xuất khung hình ảnh. Tôi đã thay đổi triển khai về UIImageView. Nếu tôi phải tính toán imageFrame của bản thân, tôi sẽ thích contentMode UIViewContentModeScaleToFill. – AechoLiu

17

Trong thực tế, nó được xây dựng-in từ iOS 4 (đối với UIViewContentModeScaleAspectFit):

@import AVFoundation; 

AVMakeRectWithAspectRatioInsideRect(imageView.image.size, imageView.bounds); 

Kể từ khi thành phần khung có thể không phải là số tròn, hãy xem xét gói cuộc gọi theo số

CGRectIntegral(…) 

Xem http://nshipster.com/image-resizing/ để biết thêm các thủ thuật.

+1

Cảm ơn bạn về thông tin này. – AechoLiu

2
if you want to calculate it yourself, use below code written by me. 

func getImageFrameInImageView(imageView : UIImageView) -> CGRect { 
    /* 
    by 徐明刚, [email protected] 
    算法: 
     设高宽比 r = h/w, 则:r(imageView) 缩写成r(v), r(image)缩写为r(i), 
     if r(i) > r(v), 则 
     h(i) = h(v), 
     h(i)/w(i) = r(i) -> w(i) = h(i)/r(i) 
     y = 0 
     x = (w(v)/2) - (w(i)/2) 
    反之 
    */ 

    let image = imageView.image! 
    let wi = image.size.width 
    let hi = image.size.height 
    print("wi:\(wi), hi:\(hi)") 

    let wv = imageView.frame.width 
    let hv = imageView.frame.height 
    print("wv:\(wv), hv:\(hv)") 

    let ri = hi/wi 
    let rv = hv/wv 
    print("ri:\(ri), rv:\(rv)") 

    var x, y, w, h: CGFloat 

    if ri > rv { 
     h = hv 
     w = h/ri 
     x = (wv/2) - (w/2) 
     y = 0 
    } else { 
     w = wv 
     h = w * ri 
     x = 0 
     y = (hv/2) - (h/2) 
    } 

    return CGRect(x: x, y: y, width: w, height: h) 
} 

Để kiểm tra xem hàm có đúng hay không, tôi đã sử dụng chế độ xem khác xác định đường viền của hình ảnh trong UIImageView.

let frameIdentifyBorderView = UIView(frame: imageFrameInImageView) 
    frameIdentifyBorderView.layer.borderWidth = 3 
    frameIdentifyBorderView.layer.borderColor = UIColor.blueColor().CGColor 

    imageView.addSubview(frameIdentifyBorderView) 

enter image description here

hoàn hảo!

3

Sử dụng api này từ AVFoundation
#import <AVFoundation/AVFoundation.h> CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(imageView.image.size, imageView.bounds);

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