簡體   English   中英

使用UIImagePickerController后無法還原回原始圖像

[英]Can't Revert Back to Original Image After Using UIImagePickerController

我在使用uiimagepickercontroller時遇到一個有趣的小問題,想知道是否有人對可能發生的事情有任何了解。 用戶可以使用相機拍照或從照片庫中挑選照片,直到母牛連續多次回家。 我的問題在於,允許用戶還原到應用程序附帶的原始圖像。 流程如下:

  1. 用戶轉到顯示圖像縮略圖的表格視圖。
  2. 用戶導航到詳細信息視圖,該視圖顯示了較大的圖像視圖。
  3. 用戶可以在詳細視圖中點擊圖像以調出自定義Alertcontroller,並具有以下選項:a)使用相機拍攝照片,b)使用其圖庫中的照片,或c)恢復為原始圖像。
  4. 用戶選擇選項“ a”或選項“ b”來拍照或使用照片庫中的圖片。 如果他們立即改變使用這些選擇之一的主意,並且只想回到使用原始圖像,則什么也不會發生! 他們可以立即拍攝另一張照片或選擇另一張圖像,但不能立即恢復為原始圖像。

當應用程序已關閉然后再次打開時,恢復為原始圖像效果很好。 有時,如果您導航到應用程序中的其他視圖,然后返回到詳細信息視圖,在該視圖中他們只是添加了自己的圖像,則該方法會起作用。 為何延誤? 我已經搜尋了兩個星期,但沒有發現任何與我的問題類似的東西或任何以任何方式提供幫助的解決方案(例如重新加載圖片所在的headerview)。 有什么想法嗎?

另外,我已經弄清楚了如何通過使用文檔將圖像保存到iCloud,但無法弄清楚如何檢索它們,因此沒有代碼。 那是完全不同的問題。 即使沒有該代碼,似乎也會發生相同的情況。

感謝您抽出寶貴的時間查看此內容!

這是一些代碼:

    -(void)bookImageTapped:(UIGestureRecognizer *)gesture
{
    URBAlertView *changeImageAlertView = [[URBAlertView alloc] initWithTitle:@"Add A New Book Cover Image" message:nil cancelButtonTitle:@"Cancel" otherButtonTitles:@"Use Camera", @"Open Gallery", @"Use Original Photo", nil];
    [changeImageAlertView setHandlerBlock:^(NSInteger buttonIndex, URBAlertView *alertView) {

        [self checkPermission];

        if (PHAuthorizationStatusAuthorized)
        {
            if(buttonIndex == 0)
            {
                if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
                {
                    [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                        UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
                        pickerController.sourceType = UIImagePickerControllerSourceTypeCamera;
                        pickerController.delegate = self;
                        pickerController.allowsEditing = NO;
                        pickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera];
                        [self presentViewController:pickerController animated:YES completion:nil];
                    }];

                    [alertView hide];
                }
                else
                {
                    NSLog(@"Camera not available");
                    [alertView hide];
                }
            }
            else if (buttonIndex == 1)
            {
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    UIImagePickerController *pickerController = [[UIImagePickerController alloc] init];
                    pickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
                    pickerController.delegate = self;
                    pickerController.allowsEditing = NO;
                    pickerController.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
                    [self presentViewController:pickerController animated:YES completion:nil];
                }];
                [alertView hide];
            }
            else if (buttonIndex == 2)
            {
                [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                    [self restoreOriginalPhoto];
                }];
                [alertView hide];
            }
            else
            {
                NSLog(@"button 2 cancel");
                [alertView hide];
            }
        }

        }];

        [changeImageAlertView show];

}

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(nonnull NSDictionary<NSString *,id> *)info
{
    [picker dismissViewControllerAnimated:YES completion:nil];
    _book.largeBookImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    _book.largeBookImage = [self scaleImage:_book.largeBookImage toSize:CGSizeMake(120, 168)];
    _bookImageView.image = _book.largeBookImage;

    _book.wasNewImageAdded = YES;
    _book.originalImageUsed = NO;

    NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    [self saveImage:_book.largeBookImage withFileName:_book.bookImageID ofType:@"jpg" inDirectory:documentsDirectory];

}

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

-(void)saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath
{
    if ([[extension lowercaseString] isEqualToString:@"png"])
    {
        [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];

        //Create a URL to the local file
        NSURL *resourceURL = [NSURL fileURLWithPath:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]]];
        if (resourceURL)
        {
            CKAsset *asset = [[CKAsset alloc] initWithFileURL:resourceURL];
            //create a record object
            CKRecord *bookCover = [[CKRecord alloc] initWithRecordType:@"Bookcover"];
            //set the record's fields
            bookCover[@"title"] = _book.title;
            bookCover[@"bookImage"] = asset;

            /* TO SAVE A RECORD */
            //get the public database
            CKContainer *appContainer = [CKContainer defaultContainer];
            CKDatabase *publicDatabase = [appContainer publicCloudDatabase];
            [publicDatabase saveRecord:bookCover completionHandler:^(CKRecord *bookCover, NSError *error) {
                if (error)
                {
                    //insert error handling
                    return;
                }
                //insert succesfully saved record code
                NSLog(@"png record saved after using picker!");
            }];
        }
    }
    else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"])
    {
        [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];

        //Create a URL to the local file
        NSURL *resourceURL = [NSURL fileURLWithPath:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]]];
        if (resourceURL)
        {
            CKAsset *asset = [[CKAsset alloc] initWithFileURL:resourceURL];
            //create a record object
            CKRecord *bookCover = [[CKRecord alloc] initWithRecordType:@"Bookcover"];
            //set the record's fields
            bookCover[@"title"] = _book.title;
            bookCover[@"bookImage"] = asset;

            /* TO SAVE A RECORD */
            //get the public database
            CKContainer *appContainer = [CKContainer defaultContainer];
            CKDatabase *publicDatabase = [appContainer publicCloudDatabase];
            [publicDatabase saveRecord:bookCover completionHandler:^(CKRecord *bookCover, NSError *error) {
                if (error)
                {
                    //insert error handling
                    return;
                }
                //insert succesfully saved record code
                NSLog(@"jpg record saved after using picker!");
            }];
        }
    }
    else
    {
        NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", extension);
    }
}

- (UIImage *) scaleImage:(UIImage*)image toSize:(CGSize)newSize 
{
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    [image drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

-(void)restoreOriginalPhoto
{
    NSLog(@"restore photo called");

    _book.originalImageUsed = YES;
    _book.wasNewImageAdded = NO;

    _bookImageView.image = _book.largeBookImage;

    NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    [self saveImage:_book.largeBookImage withFileName:_book.bookImageID ofType:@"jpg" inDirectory:documentsDirectory];


}

這是帶有imageview的headerview:

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    _headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 26)];
    _headerView.backgroundColor = [UIColor colorWithRed:8/255.0 green:46/255.0 blue:46/255.0 alpha:0.8];

if (section == 0)
{
    _headerView.backgroundColor = [UIColor whiteColor];

    _bookImageView = [[UIImageView alloc] initWithFrame:CGRectMake((tableView.frame.size.width - 120)/2, 6, 120, 168)];
    _bookImageView.contentMode = UIViewContentModeScaleAspectFit;


    if (_book.wasNewImageAdded)
    {
        NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        UIImage * image = [self loadImageWithFileName:_book.bookImageID ofType:@"jpg" inDirectory:documentsDirectory];
        _bookImageView.image = image;

    }
    else
    {
        _bookImageView.image = _book.largeBookImage;
    }

    if(_book.originalImageUsed)
    {
        NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        UIImage * image = [self loadImageWithFileName:_book.bookImageID ofType:@"jpg" inDirectory:documentsDirectory];
        _bookImageView.image = image;
    }

    UITapGestureRecognizer *bookImageTouched = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(bookImageTapped:)];
    bookImageTouched.numberOfTapsRequired = 1;
    [_bookImageView addGestureRecognizer:bookImageTouched];
    _bookImageView.userInteractionEnabled = YES;

    [_headerView addSubview:_bookImageView];
}

我終於想通了! 似乎我在混淆xcode和屬性名稱。 最后,代碼變得更加簡單。

在didFinishPickingMediaWithInfo中,我創建了一個UIImage,然后將其設置為bookImageView.image。 以后,當我希望能夠將圖像更新回原始圖像時,可以將捆綁資產稱為_book.largeBookImage。 瞧! 該圖像能夠立即更新。

最相關的代碼在下面發布。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(nonnull NSDictionary<NSString *,id> *)info
{
    [picker dismissViewControllerAnimated:YES completion:nil];

    _chosenImage = [[UIImage alloc] init];
    _chosenImage = [info objectForKey:UIImagePickerControllerOriginalImage];

    _bookImageView.image = _chosenImage;

    _book.wasNewImageAdded = YES;
    _book.originalImageUsed = NO;

    NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    [self saveImage:_chosenImage withFileName:_book.bookImageID ofType:@"jpg" inDirectory:documentsDirectory];
}

-(void)saveImage:(UIImage *)image withFileName:(NSString *)imageName ofType:(NSString *)extension inDirectory:(NSString *)directoryPath
{
    if ([[extension lowercaseString] isEqualToString:@"png"])
    {
        [UIImagePNGRepresentation(image) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"png"]] options:NSAtomicWrite error:nil];

        [self.tableView reloadData];
    }
    else if ([[extension lowercaseString] isEqualToString:@"jpg"] || [[extension lowercaseString] isEqualToString:@"jpeg"])
    {
        [UIImageJPEGRepresentation(image, 1.0) writeToFile:[directoryPath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", imageName, @"jpg"]] options:NSAtomicWrite error:nil];

        [self.tableView reloadData];
    }
    else
    {
        //NSLog(@"Image Save Failed\nExtension: (%@) is not recognized, use (PNG/JPG)", extension);
    }
}

-(void)restoreOriginalPhoto
{   
    _book.originalImageUsed = YES;
    _book.wasNewImageAdded = NO;

    _bookImageView.image = _book.largeBookImage;
    _backgroundImage.image = _book.largeBookImage; 
}

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{   
    if (section == 0)
    {
      _bookImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 120, 168)];
        _bookImageView.contentMode = UIViewContentModeScaleAspectFit;
        _bookImageView.clipsToBounds = YES;
        _bookImageView.layer.cornerRadius = 10.0f;

        if (_book.wasNewImageAdded)
        {
            NSString * documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
            UIImage * image = [self loadImageWithFileName:_book.bookImageID ofType:@"jpg" inDirectory:documentsDirectory];
            _bookImageView.image = image;
        }
        else
        {
            _bookImageView.image = _book.largeBookImage;
        }

        if(_book.originalImageUsed)
        {
            _bookImageView.image = _book.largeBookImage;
        }
    }
}

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

    if(_book.originalImageUsed)
    {
        _bookImageView.image = _book.largeBookImage;
    }

    [self.tableView reloadData];
    [self.tableView setContentOffset:CGPointZero animated:NO];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM