2013-12-10 9 views
7

In un punto della mia app, ho bisogno di usare la fotocamera, quindi richiamo lo UIImagePickerController. Sfortunatamente, una volta tornato dal controller, la maggior parte delle immagini nell'app sono a grandezza originale, indipendentemente da cosa dicono gli attributi UIImageView. L'eccezione sembra essere UIImageView s in UITableViewCell s. Questo vale per tutte le viste nell'app, non solo per quelle che hanno una connessione diretta al viewcontroller che ha chiamato lo UIImagePickerController. Una volta mentre stavo scherzando, cercando di risolvere il problema, il problema sembrava scomparire da solo, anche se non sono stato in grado di replicarlo.UIImagePickerController forza le immagini in altre viste a dimensione intera

Il codice è il seguente.

-(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]; 
} 

Edit: di estendere quanto sopra.

La base dell'applicazione è un controller di visualizzazione contenitore personalizzato, che agisce principalmente come un controller di navigazione. Quando un utente naviga verso una pagina (quello che chiamo la combinazione di un controller vista e vista) viene visualizzato nella vista Contenitore personalizzato e la pagina precedente viene archiviata in una pila.

Una delle mie pagine chiama UIImagePicker. Una volta che il selettore di immagini è stato chiuso nuovamente e torno all'app, quando apro nuove pagine vengono visualizzati problemi nell'applicazione. Non vedo problemi su ogni pagina, ma sono su diverse pagine indipendenti. La maggior parte delle pagine sembra completamente inalterata, mentre le pagine dei problemi sembrano non obbedire ai loro vincoli.

+0

Se si desidera ridimensionare l'immagine, seguire [questo collegamento] [1]. [1]: http://stackoverflow.com/a/6573100/2869784 –

+0

non ho ben capito la tua domanda. Ma hai provato a usare [UIImageView setContentMode: UIViewContentModeScaleAspectFill]; Se sono chiaro penso che tu abbia un UIImageView nel tuo xib e anche quando ha una certa dimensione quando apri l'immagine si apre in modalità a schermo intero? Senza utilizzare la dimensione del frame UIImageView? In tal caso, provare a utilizzare la modalità di contenuto di UIImageView e verificare che non sia ridimensionamento automatico. – artud2000

+0

Ho più pagine/viste diverse, ciascuna con il proprio controller xib e vista. Questo problema si estende attraverso l'app. Tutte le immagini hanno i loro contentmodes impostati (principalmente in Aspect Fill) nello xib e funzionano correttamente fino al punto in cui io chiamo UIImagePicker. Ho appena impostato la modalità di contenuto in viewWillAppear in una delle viste e ora l'immagine ha le giuste dimensioni, ma il resto della vista è rovinato, con il titolo TextView scomparso dallo schermo e il mio corpo TextView che si estende all'esterno di entrambi i lati. O i vincoli sono rovinati o la dimensione della vista genitore. – Rubberduck

risposta

3

se si desidera comprimere l'uso di immagini

+(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; 
} 

o + (UIImage *) scaleImage: (UIImage *) immagine 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

Prova in questo modo: -

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(); 
Problemi correlati