2013-12-10 7 views
7

मेरे ऐप के एक स्थान पर, मुझे कैमरे का उपयोग करने की आवश्यकता है, इसलिए मैं UIImagePickerController पर कॉल करता हूं। दुर्भाग्यवश, एक बार जब मैं नियंत्रक से वापस आ जाता हूं, तो ऐप में अधिकांश चित्र पूर्ण आकार होते हैं, इससे कोई फर्क नहीं पड़ता कि उनके UIImageView गुण क्या कहते हैं। अपवाद UIImageView एस UITableViewCell एस में प्रतीत होता है। यह ऐप में सभी विचारों पर लागू होता है, न केवल उन लोगों के लिए जिनके पास व्यू कंट्रोलर से सीधा कनेक्शन है जिसे UIImagePickerController कहा जाता है। एक बार जब मैं चारों ओर गड़बड़ कर रहा था, समस्या निवारण करने की कोशिश कर रहा था, तो समस्या खुद ही गायब हो गई, हालांकि मैं इसे दोहराने में सक्षम नहीं हूं।UIImagePickerController अन्य दृश्यों में छवियों को पूर्ण आकार

कोड निम्नानुसार है।

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    if(![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){ 
     UIAlertView *errorAlertView = [[UIAlertView alloc] initWithTitle:@"Error" 
                  message:@"Device has no camera" 
                  delegate:nil 
                  cancelButtonTitle:@"OK" 
                  otherButtonTitles:nil]; 
     [errorAlertView show]; 
     [_app.navController popPage]; 
    } 
    else if(firstTime){ 
     UIImagePickerController *picker = [[UIImagePickerController alloc] init]; 
     picker.delegate = self; 
     picker.allowsEditing = YES; 
     picker.sourceType = UIImagePickerControllerSourceTypeCamera; 

     firstTime = false; 

     [self presentViewController:picker animated:YES completion:NULL]; 
    } 
} 

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info { 
    UIImage *cameraImage = info[UIImagePickerControllerEditedImage]; 
    [picker dismissViewControllerAnimated:YES completion:NULL]; 

    NSString *folderName = @"redApp"; 
    if([_page hasChild:[RWPAGE FOLDER]]){ 
     folderName = [_page getStringFromNode:[RWPAGE FOLDER]]; 
    } 

    NSDate *datetimeNow = [[NSDate alloc] init]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd_HH-mm-ss-SSS"]; 
    NSString *filename = [NSString stringWithFormat:@"%@.png",[dateFormatter stringFromDate:datetimeNow]]; 

    NSString *applicationDocumentsDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *folderPath = [applicationDocumentsDir stringByAppendingPathComponent:folderName]; 
    NSString *filePath = [folderPath stringByAppendingPathComponent:filename]; 

    NSError *error = nil; 
    if(![[NSFileManager defaultManager] fileExistsAtPath:folderPath isDirectory:nil]){ 
     [[NSFileManager defaultManager] createDirectoryAtPath:folderPath withIntermediateDirectories:NO 
                 attributes:nil error:&error]; 
    } 

    if(error != nil){ 
     NSLog(@"Create directory error: %@", error); 
    } 

    [UIImagePNGRepresentation(cameraImage) writeToFile:filePath options:NSDataWritingAtomic error:&error]; 

    if(error != nil){ 
     NSLog(@"Error in saving image to disk. Error : %@", error); 
    } 

    RWXmlNode *nextPage = [_xml getPage:[_page getStringFromNode:[RWPAGE CHILD]]]; 
    nextPage = [nextPage deepClone]; 
    [nextPage addNodeWithName:[RWPAGE FILEPATH] value:filePath]; 

    [_app.navController pushViewWithPage:nextPage]; 
} 

-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker { 
    [picker dismissViewControllerAnimated:YES completion:NULL]; 

    [_app.navController popPage]; 
} 

संपादित करें: ऊपर पर विस्तार करने के लिए।

ऐप का आधार कस्टम कंटेनर व्यू कंट्रोलर है, जो ज्यादातर नेविगेशन कंट्रोलर की तरह काम करता है। जब कोई उपयोगकर्ता किसी पृष्ठ पर जाता है (जिसे मैं दृश्य के संयोजन को कॉल करता हूं और नियंत्रक को देखता हूं) यह कस्टम कंटेनर दृश्य पर प्रदर्शित होता है, और पिछला पृष्ठ एक ढेर में संग्रहीत होता है।

मेरे पृष्ठों में से एक UIImagePicker पर कॉल करता है। एक बार छवि पिकर फिर से बंद हो जाने के बाद, और मैं ऐप पर वापस आ जाता हूं, जब मैं नए पेज खोलता हूं तो ऐप में समस्याएं दिखाई देती हैं। मुझे हर पृष्ठ पर समस्या नहीं दिखाई देती है, लेकिन वे कई स्वतंत्र पृष्ठों पर हैं। अधिकांश पृष्ठ पूरी तरह से अप्रभावित दिखते हैं, जबकि समस्या पृष्ठ उनकी बाधाओं का पालन नहीं करते हैं।

+0

यदि आप छवि का आकार फिर से बनाना चाहते हैं तो कृपया [इस लिंक] [1] का पालन करें। [1]: http://stackoverflow.com/a/6573100/2869784 –

+0

मैं काफी अपने प्रश्न नहीं मिलता है। लेकिन क्या आपने [UIImageView setContentMode: UIViewContentModeScaleAspectFill] का उपयोग करने का प्रयास किया है; अगर मैं स्पष्ट हूं कि मुझे लगता है कि आपके xib में UIImageView है और जब भी आप छवि खोलते हैं तो यह एक निश्चित आकार होता है तो यह पूर्ण स्क्रीन मोड में खुलता है? अपने UIImageView फ्रेम आकार का उपयोग किए बिना? यदि ऐसा है तो अपने UIImageView के सामग्री मोड का उपयोग करने का प्रयास करें और जांचें कि यह ऑटो आकार बदल नहीं रहा है। – artud2000

+0

मेरे पास कई अलग-अलग पेज/विचार हैं, प्रत्येक अपने स्वयं के xib और नियंत्रक को देखते हैं। यह समस्या ऐप में फैली हुई है। चित्रों में xib में सभी सामग्री कोड सेट होते हैं (अधिकांशतः पहलू भरने के लिए), और उस बिंदु तक ठीक से काम करते हैं जहां मैं UIImagePicker कहता हूं। मैंने सामग्री दृश्य को दृश्य में एक दृश्य में सेट किया है और अब छवि का सही आकार है, लेकिन बाकी का दृश्य खराब हो गया है, मेरे शीर्षक टेक्स्टव्यू स्क्रीन से गायब हो गए हैं, और मेरे शरीर टेक्स्टव्यू दोनों के बाहर विस्तारित है पक्षों। या तो बाधाएं खराब हो जाती हैं, या माता-पिता के दृश्य का आकार। – Rubberduck

उत्तर

3

आप छवि उपयोग संपीड़ित करने के लिए चाहते हैं, तो

+(UIImage *)resizeImage:(UIImage*)image newSize:(CGSize)newSize 
{ 
CGRect newRect = CGRectIntegral(CGRectMake(0, 0, newSize.width, newSize.height)); 
CGImageRef imageRef = image.CGImage; 

UIGraphicsBeginImageContextWithOptions(newSize, NO, 0); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

// Set the quality level to use when rescaling 
CGContextSetInterpolationQuality(context, kCGInterpolationHigh); 
CGAffineTransform flipVertical = CGAffineTransformMake(1, 0, 0, -1, 0, newSize.height); 

CGContextConcatCTM(context, flipVertical); 
// Draw into the context; this scales the image 
CGContextDrawImage(context, newRect, imageRef); 

// Get the resized image from the context and a UIImage 
CGImageRef newImageRef = CGBitmapContextCreateImage(context); 
UIImage *newImage = [UIImage imageWithCGImage:newImageRef]; 

CGImageRelease(newImageRef); 
UIGraphicsEndImageContext(); 

return newImage; 
} 

या + (UIImage *) scaleImage: (UIImage *) छवि toSize: (CGSize) targetSize {

CGFloat scaleFactor = 1.0; 


if (image.size.width > targetSize.width || image.size.height > targetSize.height) 
    if (!((scaleFactor = (targetSize.width/image.size.width)) > (targetSize.height/image.size.height))) //scale to fit width, or 
     scaleFactor = targetSize.height/image.size.height; // scale to fit heigth. 

UIGraphicsBeginImageContext(targetSize); 


CGRect rect = CGRectMake((targetSize.width - image.size.width * scaleFactor)/2, 
         (targetSize.height - image.size.height * scaleFactor)/2, 
         image.size.width * scaleFactor, image.size.height * scaleFactor); 


[image drawInRect:rect]; 


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

return scaledImage; 
} 
3

इस तरह का प्रयास करें: -

UIImage *thumbnail =[UIImage imageNamed:@"yourimage.png"]; 
    CGSize itemSize = CGSizeMake(35, 35); 
    UIGraphicsBeginImageContext(itemSize); 
    CGRect imageRect = CGRectMake(0.0, 0.0, itemSize.width, itemSize.height); 
    [thumbnail drawInRect:imageRect]; 
    // Now this below image contains compressed image 
     UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
     UIGraphicsEndImageContext(); 
संबंधित मुद्दे