2013-12-10 41 views
7

在我的應用程序的一個位置,我需要使用相機,所以我打電話給UIImagePickerController。不幸的是,一旦我從控制器返回,應用程序中的大部分圖片都是全尺寸的,不管它們的屬性如何。在UITableViewCell s中似乎是UIImageView s。這適用於應用中的所有視圖,而不僅僅是那些直接連接到視圖控制器的視圖,該視圖控制器稱爲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中設置了其內容模式(主要是Aspect Fill),並且正常工作直到我調用UIImagePicker。我剛剛在viewWillAppear中的一個視圖中設置了內容模式,現在圖像的大小合適,但視圖的其餘部分被搞砸了,我的標題TextView已經消失,屏幕上我的主體TextView也擴展了兩側。無論是約束都搞砸了,還是父視圖的大小。 – 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();