2011-01-17 14 views
27

मैं UIImageView की सामग्री मोड संपत्ति को संशोधित करता हूं। तो मेरी छवि का फ्रेम UIImageView के फ्रेम के बराबर नहीं है। मेरी समस्या यह है कि UIImageView से छवि के फ्रेम को कैसे पुनः प्राप्त करें।UIImageView से प्रदर्शित छवि फ्रेम कैसे प्राप्त करें?

निम्न उदाहरण के रूप में, नारंगी आयताकार UIImageView की सीमा है। यह स्पष्ट रूप से है कि छवि का फ्रेम UIImageView जैसा नहीं है।

Figure 1

उत्तर

33

यदि यह UIViewContentModeScaleAspectFit है, यह कुछ इस तरह है:

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

से इस API का उपयोग तो, UIImageView छवि के फ्रेम को पुनः प्राप्त करने के लिए कोई सीधा तरीका है। इसे मैन्युअल रूप से गणना करने की आवश्यकता है, है ना? – AechoLiu

+0

हां। वास्तव में, ऐसा लगता है कि यह एक निजी विधि भी नहीं है जो 'सामग्री मोड' के आधार पर छवि के फ्रेम को लौटाती है। मुझे लगता है कि गणना '-drawRect:' और '-sizeThatFits: 'में की जाती है। – Costique

+0

मैंने आकार की कोशिश की है: यह छवि के फ्रेम को पुनः प्राप्त नहीं कर सकता है। मैंने UIImageView के कार्यान्वयन को बदल दिया। अगर मुझे स्वयं द्वारा छवि फ्रेम की गणना करना है, तो मैं सामग्री को पसंद करूंगा। UIViewContentModeScaleToFill। – AechoLiu

17

वास्तव में, यह आईओएस 4 (UIViewContentModeScaleAspectFit के लिए) के बाद से निर्मित है:

@import AVFoundation; 

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

फ्रेम घटकों के बाद से गोल संख्या नहीं हो सकती है,

द्वारा कॉल को लपेटने पर विचार करें

अधिक चाल के लिए http://nshipster.com/image-resizing/ देखें। यदि समारोह सही है

+1

इस जानकारी के बारे में धन्यवाद। – 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) 
} 

परीक्षण करने के लिए या नहीं, मैं UIImageView में छवि की सीमा की पहचान एक और दृश्य का उपयोग किया है।

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

    imageView.addSubview(frameIdentifyBorderView) 

enter image description here

सही!

3

AVFoundation
#import <AVFoundation/AVFoundation.h> CGRect imageRect = AVMakeRectWithAspectRatioInsideRect(imageView.image.size, imageView.bounds);

संबंधित मुद्दे