2013-12-10 4 views
7

An einer Stelle meiner app, ich brauche die Kamera zu verwenden, so nenne ich die UIImagePickerController auf. Leider, sobald ich vom Controller zurückkehre, sind die meisten Bilder in der App voller Größe, egal was ihre UIImageView Attribute sagen. Die Ausnahme scheint UIImageView s in UITableViewCell s zu sein. Dies gilt für alle Ansichten in der App, nicht nur für solche, die direkt mit dem Viewcontroller verbunden sind, der UIImagePickerController heißt. Einmal, während ich herumalberte und versuchte, Fehler zu beheben, schien das Problem von selbst zu verschwinden, obwohl ich das nicht replizieren konnte.UIImagePickerController Kräfte Bilder in anderen Ansichten in voller Größe

Der Code ist wie folgt.

-(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: Um auf die oben zu erweitern.

Die Basis der App ist ein Custom Container-View-Controller, meist wie eine Navigation Controller fungiert. Wenn ein Benutzer zu einer Seite navigiert (was ich die Kombination eines Ansichts- und Ansichtscontrollers nenne), wird er in der Ansicht "Benutzerdefinierter Container" angezeigt, und die vorherige Seite wird in einem Stapel gespeichert.

Eine meiner Seiten ruft einen UIImagePicker auf. Nachdem die Bildauswahl wieder geschlossen wurde und ich zur App zurückkehre, erscheinen Probleme in der App, wenn ich neue Seiten öffne. Ich sehe keine Probleme auf jeder Seite, aber sie befinden sich auf mehreren unabhängigen Seiten. Die meisten Seiten sehen völlig unbeeinflusst aus, während die Problemseiten ihren Einschränkungen scheinbar nicht folgen.

+0

Wenn Sie das Bild erneut vergrößern möchten, folgen Sie bitte [diesem Link] [1]. [1]: http://stackoverflow.com/a/6573100/2869784 –

+0

ich nicht ganz Ihre Frage bekommen. Aber haben Sie versucht, [UIImageView setContentMode: UIViewContentModeScaleAspectFill] zu verwenden; Wenn ich klar bin, denke ich, dass Sie eine UIImageView in Ihrem Xib haben und selbst wenn es eine bestimmte Größe hat, wenn Sie das Bild öffnen, öffnet es sich im Vollbildmodus? Ohne Ihre UIImageView Rahmengröße zu verwenden? Wenn ja, versuche den Inhaltsmodus deines UIImageView zu verwenden und überprüfe, dass es nicht automatisch skaliert wird. – artud2000

+0

Ich habe mehrere verschiedene Seiten/Ansichten mit jeweils eigenen XIB- und View-Controllern. Dieses Problem erstreckt sich auf die gesamte App. Die Bilder haben alle ihre contentmodes in der xib (meistens Aspect Fill) und funktionieren bis zu dem Punkt, an dem ich den UIImagePicker anrufe. Ich habe gerade den contentmode in viewWillAppear in einer der Ansichten und jetzt das Bild hat die richtige Größe, aber der Rest der Ansicht ist vermasselt, mit meinem Titel TextView sind vom Bildschirm verschwunden, und meine Körper TextView erstreckt sich außerhalb von beiden Seiten. Entweder sind die Einschränkungen verschärft oder die Größe der übergeordneten Ansicht. – Rubberduck

Antwort

3

wenn Sie möchten Bild Verwendung

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

oder + (UIImage *) Scaleimage komprimieren: (UIImage *) Bild 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

Versuchen wie folgt aus: -

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(); 
Verwandte Themen