2012-03-28 11 views
11

मैं आईओएस 4 एप्लिकेशन विकसित कर रहा हूं।UIImageView, setClipsToBounds और मेरी छवियां उनके सिर को कैसे खो रही हैं

मैं एक UITableViewCell पर एक UIImageView पर इस कोड का उपयोग कर रहा हूँ:

cell.photo.contentMode = UIViewContentModeScaleAspectFill; 
[cell.photo setClipsToBounds:YES]; 

मेरी छवियाँ विस्तृत से ज़्यादा लंबे, और जब मैं UIViewContentModeScaleAspectFill सेट, छवियों UIImageView चौड़ाई के साथ चौड़ाई के अनुसार बदल जाता है। ऐसा करने से, छवि बड़ी हो जाती है कि UIImageView और मैं इसे UIImageView के बाहर देखता हूं।

फिर, मुझे इसकी अनुमति देने के लिए setClipsToBounds:YES का उपयोग करने की आवश्यकता नहीं है, लेकिन अब मेरी सभी छवियां अपना सिर खो देती हैं।

क्या UIViewContentModeScaleAspectFill और शीर्ष बाएं UIImageView कोने के साथ केंद्र शीर्ष बाएं छवि कोने का उपयोग करने का कोई तरीका है? अगर मुझे छवि का एक हिस्सा खोना है, तो मैं अपने पैरों को खोना पसंद करता हूं।

अद्यतन

मैं sdWebImage ढांचे का उपयोग कर रहा है और मैं वादिम Yelagin जवाब का इस्तेमाल किया है और यह अब मेरी कोड है:

[cell.photo setImageWithURL:[NSURL URLWithString:entry.photo] 
       placeholderImage:[UIImage imageNamed:@"placeholder.png"] 
         success:^(UIImage *image) { 
          CGFloat scaleX = cell.photoBorder.bounds.size.width/image.size.width; 
          CGFloat scaleY = cell.photoBorder.bounds.size.height/image.size.height; 
          CGFloat scale = MAX(scaleX, scaleY); 
          cell.photo.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); 
          cell.photo.image = image; 
         } 
         failure:nil]; 

मैं सभी छवियों को लोड करने के लिए इंतजार करना पड़ता है और सही सेल पर सही छवि देखने के लिए UITableView के आस-पास स्थानांतरित करें (ऐसा इसलिए है क्योंकि छवियों को कैश किया जाता है और यह तेज़ी से लोड होता है)।

इसके बजाय cell.photo.frame और cell.photo.image का उपयोग करके मुझे सही सेल प्राप्त करने के लिए indexPath.row ब्लॉक करने की आवश्यकता है।

मैं UIImageView + WebCache करने के लिए एक नई विधि जोड़ सकते हैं:

- (void)setImageWithURL:(NSURL *)url placeholderImage:(UIImage *)placeholder success:(void (^)(UIImage *image, NSInteger row))success failure:(void (^)(NSError *error))failure; 
{ 
    [self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; 
} 

लेकिन अगर मैं ऐसा, मैं एक त्रुटि यहाँ प्राप्त:

[self setImageWithURL:url placeholderImage:placeholder options:0 success:success failure:failure]; 

क्योंकि अब सफलता प्रकार (void (^)(UIImage *image)) का नहीं है

क्या आप जानते हैं कि मैं इस समस्या को कैसे ठीक कर सकता हूं?

उत्तर

0

कोई अंतर्निहित तरीका यह है नहीं है, लेकिन आप इसे मैन्युअल कर सकते हैं:

UIGraphicsBeginImageContext(CGSizeMake(desiredWidth, desiredHeight)); 

[originalImage drawAtPoint...]; 
... 

UIImage *scaledImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
+0

धन्यवाद कुछ करना है, लेकिन मैं अपने कोड समझ में नहीं आता, क्षमा करें। – VansFannel

+0

आप 'UIGraphicsBeginImageContext' का उपयोग करके एक छवि संदर्भ बनाते हैं और उसके बाद मूल छवि को स्केल कर लेते हैं ताकि यह पूरे संदर्भ को भर सके लेकिन छवि का शीर्ष बायां (0 | 0) पर है। –

2

AFAIK, सबसे आसान तरीका है छवि का आकार और फ्रेम से मैन्युअल रूप से imageView के फ्रेम की गणना करने के लिए है आप इसे फिट करना चाहते हैं।

उस फ्रेम के साथ एक दृश्य बनाएं जिसे आप वर्तमान में अपनी छवि के लिए निर्दिष्ट कर रहे हैं दृश्य देखें, छवि को अपना सबव्यू देखें। view.clipsToBounds = YES सेट करें।

फिर जब आप एक छवि निर्दिष्ट करते हैं, जैसे

CGFloat scaleX = view.bounds.size.width/image.size.width; 
CGFloat scaleY = view.bounds.size.height/image.size.height; 
CGFloat scale = MAX(scaleX, scaleY); 
imageView.frame = CGRectMake(0, 0, image.size.width * scale, image.size.height * scale); 
imageView.image = image; 
+1

धन्यवाद।आपका समाधान काम करता है लेकिन मैं sdwebimage ढांचे का उपयोग कर रहा हूं, और मेरी छवियां असीमित रूप से लोड होती हैं और वे UITableViewCells पर आती हैं, इसलिए मुझे इसे काम करने के लिए अपने कोड को समायोजित करने की आवश्यकता होगी। मैं अपने प्रश्न के साथ अपने प्रश्न को अपडेट करने जा रहा हूं और अपनी नई समस्या लिखूंगा। – VansFannel

+0

आप छवि की 'छवि' प्रॉपर्टी को देखकर (कुंजी-मान) आज़मा सकते हैं और अपने पर्यवेक्षक कोड में फ्रेम समायोजित कर सकते हैं। या उप-वर्ग UIImageView और इसके 'setImage:' ओवरराइड करें। –

+0

मैंने इसे उपclass करने की कोशिश की है, लेकिन मुझे एक और समस्या है। मैंने इस सवाल को नई समस्या से अपडेट कर लिया है। – VansFannel

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