iOS 8 Chụp nhanh một chế độ xem chưa được hiển thị dẫn đến một ảnh chụp nhanh trống


228

Trong iOS 8, tôi gặp sự cố khi chụp ảnh từ camera cho đến bây giờ tôi đang sử dụng mã này cho

UIImagePickerController *controller=[[UIImagePickerController alloc] init];
controller.videoQuality=UIImagePickerControllerQualityTypeMedium;
controller.delegate=(id)self;
controller.sourceType=UIImagePickerControllerSourceTypeCamera;
[self presentViewController:controller animated:YES completion:nil];

Nhưng trong iOS 8 tôi nhận được điều này:

Snapshotting a view that has not been rendered results in an empty snapshot. Ensure your view has been rendered at least once before snapshotting or snapshot after screen updates.

Tôi đã thử với giải pháp được cung cấp bởi Bài đăng này với

@property (strong,nonatomic)UIImagePickerController *controller;

_controller=[[UIImagePickerController alloc] init];
_controller.videoQuality=UIImagePickerControllerQualityTypeMedium;
_controller.delegate=(id)self;
_controller.sourceType=UIImagePickerControllerSourceTypeCamera;
_[self presentViewController:controller animated:YES completion:nil];

và điều này

...
controller.modalPresentationStyle=UIModalPresentationFullScreen;
or
controller.modalPresentationStyle=UIModalPresentationCurrentContext;
...

và điều này

double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    [self presentViewController:controller animated:YES completion:nil];
});

và điều này

[self presentViewController:controller animated:YES completion:NULL];

và điều này

[self presentViewController:controller animated:YES completion:^{

}];

bất kỳ ý tưởng?


3
Có cùng một vấn đề và hơn nữa lỗi này làm hỏng ứng dụng của tôi nhiều lần. Hy vọng bản cập nhật 8.0.2 sẽ sửa lỗi này. Khi tôi chạy ứng dụng của mình trong iOS7, nó hoạt động như bùa mê mà không có bất kỳ cảnh báo ngu ngốc nào. Có vẻ như iOS 8 có một chặng đường dài để ổn định.
NCFUSN

9
Sự kiện với bản cập nhật 8.0.2 vẫn còn tồn tại
ArdenDev

2
Tôi đã có cùng một vấn đề. Sau khi tôi chụp ảnh, tôi đang thực hiện một số xử lý trong một chủ đề khác. Sau khi tôi chuyển mã đến luồng chính, mọi thứ đều ổn. Tức là mã của tôi trước đây là: dispatch_async(dispatch_get_main_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{mà tôi đã đổi thànhdispatch_async(dispatch_get_main_queue(), ^{
mikeyq6

9
Vấn đề tương tự xảy ra trong iOS 8.1
Raptor

12
Xảy ra trong iOS 9.
Sebyddd

Câu trả lời:


131

Tôi khá chắc chắn rằng đây chỉ là một lỗi trong iOS 8.0. Nó có thể tái tạo với các ứng dụng POC đơn giản nhất, không có gì khác hơn là cố gắng trình bày UIImagePickerControllergiống như bạn đang làm ở trên. Hơn nữa, theo kiến ​​thức của tôi, không có mẫu thay thế nào để hiển thị trình chọn ảnh / máy ảnh. Bạn thậm chí có thể tải xuống ứng dụng mẫu của UIImagePickerControll của Apple , chạy nó và nó sẽ tạo ra lỗi tương tự.

Điều đó nói rằng, các chức năng vẫn hoạt động cho tôi. Khác với cảnh báo / lỗi, bạn có gặp vấn đề với chức năng của ứng dụng không?


2
Vâng có lẽ đó là một lỗi, mã cũng hoạt động tốt với tôi.
souvickcse

4
@souvickcse Tôi cũng gặp phải lỗi này. Bất cứ khi nào nó xảy ra, bản xem trước hình ảnh bật lên sau khi một bức ảnh mới được chụp là hoàn toàn màu đen. Tuy nhiên, các nút "Chụp lại" và "Sử dụng ảnh" ở cuối màn hình vẫn xuất hiện và hoạt động bình thường. Bạn đang chứng kiến ​​hành vi tương tự?
Barry Beerman

3
@souvickcse Tôi đang sử dụng đường cơ sở plugin camera phonegap mới nhất được đặt tại đây: github.com/apache/cordova-plugin-camera . Mọi thứ đều hoạt động tốt với iOS 7.1 chạy trên iPhone 5 nhưng tôi không thể tìm ra cách để nó hoạt động chính xác bằng iOS 8 trên iPhone 6.
Barry Beerman

2
Điều tương tự đối với tôi với trận chung kết
iOS8.1

4
Vẫn có mặt trong iOS 9
Reverend

45

Tôi đã vật lộn với vấn đề này trong vài giờ, tôi đã đọc mọi chủ đề liên quan và phát hiện ra rằng lỗi là do cài đặt quyền riêng tư của thiết bị, quyền truy cập máy ảnh vào ứng dụng của tôi đã bị chặn !!! Tôi chưa bao giờ từ chối quyền truy cập vào máy ảnh và tôi không biết làm thế nào nó bị chặn nhưng đó là vấn đề!


4
Tôi không chắc nó có thực sự hiệu quả với bạn không, nhưng nó không hiệu quả với tôi. Tôi chỉ hy vọng rằng @KevinH là chính xác.
Deepak Thakur

4
Không, quyền truy cập máy ảnh được kiểm tra BẬT cho ứng dụng đó trong trường hợp của tôi. Nhưng tôi tin rằng điều này có thể được gây ra mặc dù gián tiếp bởi các cài đặt: thay đổi cài đặt đôi khi không có hiệu lực ngay lập tức, một người nào đó trong cupertino phải tối ưu hóa một cuộc gọi để đồng bộ hóa ở đâu đó
Anton Tropashko 16/1/2015

Đề nghị này đã giải quyết vấn đề cho tôi. Trước đó tôi đã chạm vào "Không cho phép" khi bộ chọn máy ảnh xuất hiện trong ứng dụng của tôi. Tôi nghĩ rằng nó sẽ hỏi tôi mỗi lần tôi truy cập máy ảnh, nhưng không được. Tôi phải truy cập Cài đặt> Quyền riêng tư> Máy ảnh và bật thanh trượt cho ứng dụng của mình. Sau đó, nó hoạt động đúng. Có vẻ hơi ngớ ngẩn khi Apple không hỏi mỗi lần ...
John Contarino

chính xác, đôi khi chúng ta không thể nghĩ vấn đề được nêu ra cho loại sai lầm này. bạn thân rất hữu ích
Mr.Javing Multani

Tùy chọn tốt nhất là trước khi sử dụng máy ảnh để phát hiện xem khả năng có hoạt động hay không và nếu không, hãy cảnh báo người dùng rằng chụp ảnh không khả dụng cho đến khi máy ảnh được kích hoạt trên cài đặt. Trên iOS 10, có thể gửi người dùng đến các cài đặt ứng dụng cụ thể (có thể trước iOS 8, nhưng không thể có trong iOS 8 và 9, nếu tôi nhớ chính xác).
kindaian

33

Tôi không có đủ điểm danh tiếng để nhận xét về câu trả lời của @ greg ở trên, vì vậy sẽ thêm các quan sát của tôi vào đây. Tôi có một dự án Swift cho cả iPad và iPhone. Tôi có một phương thức bên trong trình điều khiển khung nhìn chính của mình (bit có liên quan bên dưới). Khi tôi kiểm tra điều này trên điện thoại, mọi thứ đều hoạt động bình thường và không có cảnh báo nào được tạo ra. Khi tôi chạy nó trên iPad, mọi thứ đều hoạt động bình thường nhưng tôi thấy cảnh báo về việc chụp nhanh chế độ xem. Tuy nhiên, điều thú vị là khi tôi chạy trên iPad mà không sử dụng bộ điều khiển popover, mọi thứ đều hoạt động bình thường mà không có cảnh báo. Thật không may, Apple yêu cầu bộ chọn hình ảnh phải được sử dụng trong một cửa sổ bật lên trên iPad, nếu máy ảnh không được sử dụng.

    dispatch_async(dispatch_get_main_queue(), {
        let imagePicker: UIImagePickerController = UIImagePickerController();
        imagePicker.sourceType = UIImagePickerControllerSourceType.SavedPhotosAlbum;
        imagePicker.mediaTypes = [kUTTypeImage];
        imagePicker.allowsEditing = false;
        imagePicker.delegate = self;

        if(UIDevice.currentDevice().userInterfaceIdiom == .Pad){ // on a tablet, the image picker is supposed to be in a popover
            let popRect: CGRect = buttonRect;
            let popover: UIPopoverController = UIPopoverController(contentViewController: imagePicker);
            popover.presentPopoverFromRect(popRect, inView: self.view, permittedArrowDirections: UIPopoverArrowDirection.Up, animated: true);
        }else{
            self.presentViewController(imagePicker, animated: true, completion: nil);
        }
    });

Có vẻ như đây là một đề xuất chính xác vì tôi có thông báo lỗi đó ngay cả với iOS 9.0.2. Tôi có ứng dụng chỉ dành cho iPhone và khi tôi chạy nó trên iPad Mini, tôi thấy thông báo đó khi trình bày trình chọn hình ảnh. Vì một số lý do, iOS nghĩ rằng tôi chạy ứng dụng iPad.
John Tracid

16

Tôi đã gặp phải điều này sau khi gọi UIImagePickerControll PresentViewControll: từ cuộc gọi lại đến một đại biểu UIAlertView. Tôi đã giải quyết vấn đề bằng cách đẩy PresentViewControll: gọi tắt dấu vết thực thi hiện tại bằng cách sử dụng Clark_async.

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex
{
    dispatch_async(dispatch_get_main_queue(), ^{
        UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
        imagePickerController.delegate = self;

        if (buttonIndex == 1)
            imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
        else
            imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera;

        [self presentViewController: imagePickerController
                           animated: YES
                         completion: nil];
    });
}

Đây là những gì đã giải quyết nó cho tôi. Tôi đã cố gắng trình bày UIImagePickerContoder từ bên trong khối hành động của UIAlertAction.
josefdlange

alertView đã không được chấp nhận, điều này có hoạt động không nếu tôi sử dụng async bên trong một hành động UIAlertViewControll thay thế?
DrPatience

@DrPatience Chắc chắn. Clark_async hoạt động bất cứ nơi nào bạn muốn. Tôi không biết rằng nó cần thiết (sẽ phụ thuộc vào mã của bạn). Đọc trên GCD - nó có rất nhiều công dụng.
greg

12

Tôi gặp vấn đề này khi tạo hiệu ứng cho một số lượt xem và ứng dụng sẽ chuyển sang chế độ nền và quay lại. Tôi đã xử lý nó bằng cách đặt cờ isActive. Tôi đặt nó thành KHÔNG trong

- (void)applicationWillResignActive:(UIApplication *)application

và CÓ trong

- (void)applicationDidBecomeActive:(UIApplication *)application

và animate hoặc không làm động các quan điểm của tôi cho phù hợp. Đã quan tâm đến vấn đề.


11

Tôi đã có điều này với một UIAlertControllStyleActionSheet cung cấp cho người dùng tùy chọn chụp ảnh bằng máy ảnh hoặc sử dụng một từ thư viện.

Tôi đã thử một điểm dừng tượng trưng trên thông báo lỗi nhập mô tả hình ảnh ở đây

Điều đó cho tôi thấy lỗi được tạo ra bởi việc sử dụng UICollectionView trong khi trình bày

[self presentViewController:alert animated:YES completion:nil];

nhập mô tả hình ảnh ở đây

Tôi đã sửa lỗi này bằng cách cài đặt khung một cách rõ ràng trước khi trình bày

[alert setPreferredContentSize: alert.view.frame.size];

Đây là methode hoàn chỉnh đang hoạt động mà không có lỗi

-(void)showImageSourceAlertFromSender:(id)sender{
UIButton *senderButton = (UIButton*)sender;
UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
UIAlertAction *cameraAction = [UIAlertAction actionWithTitle:@"Camera" style:UIAlertActionStyleDefault
                                                     handler:^(UIAlertAction *action) {
                                                         [self takePhoto];
                                                     }];
UIAlertAction *libraryAction = [UIAlertAction actionWithTitle:@"Library" style:UIAlertActionStyleDefault
                                                      handler:^(UIAlertAction *action) {
                                                          [self selectPhotoFromLibraryFromSender:sender];
                                                      }];
[alert addAction:cameraAction];
[alert addAction:libraryAction];
alert.popoverPresentationController.delegate = self;
alert.popoverPresentationController.sourceRect = senderButton.frame;
alert.popoverPresentationController.sourceView = self.view;

[alert setPreferredContentSize: alert.view.frame.size];

[self presentViewController:alert animated:YES completion:^(){
}];}

10

Bạn có thể tắt tiếng cảnh báo "Chụp nhanh chế độ xem" bằng cách tham chiếu thuộc viewtính trước khi trình bày bộ điều khiển chế độ xem. Làm như vậy sẽ khiến chế độ xem tải và cho phép iOS hiển thị trước khi chụp ảnh nhanh.

UIAlertController *controller = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
controller.modalPresentationStyle = UIModalPresentationPopover;
controller.popoverPresentationController.barButtonItem = (UIBarButtonItem *)sender;

... setup the UIAlertController ... 

[controller view]; // <--- Add to silence the warning.

[self presentViewController:controller animated:YES completion:nil];

Đó là một mẹo gần như vô cùng hữu ích. Cảm ơn bạn!!!! (Trong trường hợp của tôi, tôi vẫn nhận được cảnh báo, nhưng ứng dụng không còn gặp sự cố nữa.)
Fattie 17/05/2016

Tuy nhiên, khi tôi thêm một cameraOverlayView, thật không may, tôi vẫn gặp vấn đề này ngay cả khi tôi áp dụng mẹo này.
Fattie 17/05/2016

8

Đối với bất kỳ ai đang nhìn thấy sự cố với bản xem trước màu đen sau khi chụp ảnh, việc ẩn thanh trạng thái sau khi UIPickerCont kiểm soát được hiển thị dường như khắc phục sự cố.

UIImagePickerControllerSourceType source = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] ? UIImagePickerControllerSourceTypeCamera : UIImagePickerControllerSourceTypeSavedPhotosAlbum;
UIImagePickerController *cameraController = [[UIImagePickerController alloc] init];
        cameraController.delegate = self;
        cameraController.sourceType = source;
        cameraController.allowsEditing = YES;
        [self presentViewController:cameraController animated:YES completion:^{
            //iOS 8 bug.  the status bar will sometimes not be hidden after the camera is displayed, which causes the preview after an image is captured to be black
            if (source == UIImagePickerControllerSourceTypeCamera) {
                [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
            }
        }];

1
hoàn toàn tiết kiệm được ngày của tôi! Tôi đã thử các phương pháp ở trên, không có phương pháp nào hiệu quả. Và cách này hiệu quả
Stan

Giải pháp không hoạt động. Tôi nghĩ rằng khi chúng tôi chụp một hình ảnh tại thời điểm đó StatusBar đã được ẩn.
Mihir Oza

5

Tôi tìm thấy cùng một vấn đề và thử mọi thứ. Tôi có hai ứng dụng khác nhau, một trong mục tiêu-C và một trong nhanh chóng - cả hai đều có cùng một vấn đề. Thông báo lỗi xuất hiện trong trình gỡ lỗi và màn hình chuyển sang màu đen sau bức ảnh đầu tiên. Điều này chỉ xảy ra trong iOS> = 8.0, rõ ràng đó là một lỗi.

Tôi tìm thấy một cách giải quyết khó khăn. Tắt các điều khiển camera bằng imagePicker.showsCameraControls = false và tạo lớp phủ riêng của bạn có các nút bị thiếu. Có nhiều hướng dẫn khác nhau về cách làm điều này. Thông báo lỗi lạ vẫn tồn tại, nhưng ít nhất màn hình không bị đen và bạn có một ứng dụng đang hoạt động.


Tôi đã có cùng một vấn đề như bạn, xem câu trả lời của tôi dưới đây.
Dan

5

Đây có thể là một lỗi của ImagePickerControll tích hợp. Mã của tôi đang hoạt động, nhưng thỉnh thoảng gặp sự cố trên iPhone 6 Plus.

Tôi đã thử tất cả các giải pháp được đề xuất bởi các câu trả lời khác nhưng không có may mắn. Vấn đề cuối cùng đã được giải quyết sau khi chuyển sang JPSImagePickerControll .


3

Tôi đã thử tất cả mọi thứ, vấn đề của tôi là bộ chọn ảnh cho máy ảnh và thư viện ảnh biến mất ngay sau khi chúng hiển thị. Tôi đã giải quyết nó bằng dòng sau (swift)

imagePicker.modalPresentationStyle = UIModalPresentationStyle.OverCurrentContext

3

Tôi khá chắc chắn rằng đây chỉ là một lỗi trong iOS 8.0. Nó có thể tái tạo với các ứng dụng POC đơn giản nhất, không có gì khác hơn là cố gắng trình bày một UIImagePickerContoder như bạn đang làm ở trên. Hơn nữa, theo kiến ​​thức của tôi, không có mẫu thay thế nào để hiển thị trình chọn ảnh / máy ảnh. Bạn thậm chí có thể tải xuống ứng dụng mẫu của UIImagePickerControll của Apple, chạy nó và nó sẽ tạo ra lỗi tương tự.

Điều đó nói rằng, các chức năng vẫn hoạt động cho tôi. Khác với cảnh báo / lỗi, bạn có gặp vấn đề với chức năng của ứng dụng không?


3

Nếu chúng ta đang sử dụng UIImagePickerController như một tài sản, thì cảnh báo này sẽ biến mất.giả sử rằng chúng ta không sử dụng kết quả từ UIImagePickerController, nếu chúng ta đang khởi tạo UIImagePickerControllerbên trong một hàm.


2

Gọi phương pháp này làm việc cho tôi. Đặt nó sau khi trình bày quan điểm của bạn.

[yourViewBeingPresented.view layoutIfNeeded];

1

Tôi cũng gặp phải vấn đề tương tự và tôi đã giải quyết nó bằng cách kiểm tra xem camera có khả dụng không:

BOOL cameraAvailableFlag = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
    if (cameraAvailableFlag)
        [self performSelector:@selector(showcamera) withObject:nil afterDelay:0.3];

1
isSourceTypeAv Available trả về đúng mặc dù tôi đã từ chối quyền truy cập vào máy ảnh cho ứng dụng của mình. Màn hình hiển thị trống nếu truy cập máy ảnh bị từ chối.
Καrτhικ 14/2/2015

1

Tôi đã gặp vấn đề này. Khi chúng tôi gọi máy ảnh và phát hành các quan điểm tạo ra vấn đề này. Ví dụ, gọi một camera và đặt nil view trong phương thức viewDidDisappear, lỗi này sẽ xuất hiện do không có cuộc gọi lại cho sự kiện camera. Hãy chắc chắn về trường hợp này quá cho lỗi này.


1

Tôi gặp lỗi tương tự, nhận được thông báo dưới đây trong khi mở camera.

'Chụp nhanh một khung nhìn chưa được hiển thị sẽ dẫn đến một ảnh chụp nhanh. Đảm bảo chế độ xem của bạn đã được hiển thị ít nhất một lần trước khi chụp nhanh hoặc chụp nhanh sau khi cập nhật màn hình. '

Đối với tôi, vấn đề là với tên hiển thị Bundle trong tệp Info.plist. Tôi trống một số cách, tôi đặt tên ứng dụng của mình ở đó và bây giờ nó hoạt động tốt. Tôi không nhận được bất kỳ cảnh báo cấp phép máy ảnh nào vì tên hiển thị Bundle trống. chặn chế độ xem khỏi kết xuất.

vấn đề không nằm ở chế độ xem mà bằng cách trình bày nó mà không có sự cho phép. Bạn có thể kiểm tra nó trên cài đặt -> quyền riêng tư -> Máy ảnh, nếu ứng dụng của bạn không được liệt kê thì vấn đề có thể giống nhau.


1

Tôi đang sử dụng Phonegap, nhưng chủ đề này tiếp tục là chủ đề đầu tiên khi thông báo về thông báo lỗi.

Đối với tôi, vấn đề này đã biến mất bằng cách định nghĩa hình ảnh thành PNG.

encodingType : Camera.EncodingType.PNG

Vì vậy, toàn bộ dòng là:

 navigator.camera.getPicture(successFunction, failFunction, { encodingType : Camera.EncodingType.PNG, correctOrientation:true, sourceType : Camera.PictureSourceType    .PHOTOLIBRARY, quality: 70, allowEdit : false , destinationType: Camera.DestinationType.DATA_URL});

Số dặm của bạn có thể thay đổi, nhưng điều đó đã tạo nên mánh khóe cho tôi.


1

Ngoài ra, xem xét sử dụng drawViewHierarchyInRect:

Nhanh:

extension UIImage{

    class func renderUIViewToImage(viewToBeRendered: UIView) -> UIImage
    {
        UIGraphicsBeginImageContextWithOptions(viewToBeRendered.bounds.size, true, 0.0)
        viewToBeRendered.drawViewHierarchyInRect(viewToBeRendered.bounds, afterScreenUpdates: true)
        viewToBeRendered.layer.renderInContext(UIGraphicsGetCurrentContext()!)

        let finalImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return finalImage
    }
}

Mục tiêu-C:

- (UIImage *)snapshot:(UIView *)view
{
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, YES, 0);
    [view drawViewHierarchyInRect:view.bounds afterScreenUpdates:YES];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

Cũng thấy:


0

Trong trường hợp của tôi (XCode 7 và iOS 9), tôi sử dụng UINavigationController"ẩn", vì vậy Ihave để thêm UINavigationControllerDelegatevào máy ảnh hoặc cuộn và nó hoạt động như mong muốn! And pickerControllerDelegate.selfcũng không hiển thị lỗi!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.