Frage UIImagePickerController zwingt Bilder in anderen Ansichten auf die volle Größe


An einer Stelle meiner App muss ich die Kamera benutzen, also rufe ich die an UIImagePickerController. Leider, sobald ich vom Controller zurückkehre, sind die meisten Bilder in der App voller Größe, egal was UIImageView Attribute sagen. Die Ausnahme scheint zu sein UIImageViews in UITableViewCells. Dies gilt für alle Ansichten in der App, nicht nur für solche, die eine direkte Verbindung mit dem Viewcontroller haben, der den Aufruf aufgerufen hat UIImagePickerController. Einmal, während ich herumalberte und versuchte, Fehler zu beheben, schien das Problem von selbst zu verschwinden, obwohl ich das nicht replizieren konnte.

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

Bearbeiten: Um das oben genannte zu erweitern.

Die Basis der App ist ein Custom Container View Controller, der hauptsächlich wie ein Navigations-Controller funktioniert. 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.


7
2017-12-10 12:50


Ursprung


Antworten:


wenn Sie die Bildnutzung komprimieren möchten

+(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: (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
2017-12-17 12:55



Versuche es so: -

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

3
2017-12-18 17:11