Черная полоса в UIImagePicker на iPad - только в альбомной ориентации - PullRequest
1 голос
/ 08 декабря 2011

Я показываю UIImagePicker (сам в UIView) через UIPopOver. Это работает нормально, однако, когда iPad поворачивается на правую сторону, я получаю странную черную полосу вдоль левой стороны поповера, как показано на рисунке ниже. Кнопка отмены также частично находится на правой руке экрана. Этого не происходит ни в какой другой странной ориентации.

Код также указан ниже. Кто-нибудь может подсказать, почему я получаю эту черную полосу?

imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = self;
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

CGFloat width = CGRectGetWidth(self.view.bounds);
CGFloat height = CGRectGetHeight(self.view.bounds);

UIViewController *containerController = [[UIViewController alloc] init];
containerController.contentSizeForViewInPopover = CGSizeMake(width, height);
[imagePickerController.view setFrame:containerController.view.frame];
[containerController.view addSubview:imagePickerController.view];



if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    Class cls = NSClassFromString(@"UIPopoverController");
    if (cls != nil) {

        popoverController = [[UIPopoverController alloc] initWithContentViewController:containerController];

        [popoverController presentPopoverFromRect:selectedRect inView:self.view permittedArrowDirections:4 animated:YES];

        [containerController release];

    }

Screenshot

Ответы [ 3 ]

3 голосов
/ 08 декабря 2011

По какой-то странной причине, рамка представления действительно изменяется в альбомной ориентации.

Чтобы преодолеть это, установите рамку после , когда вы представите всплывающее окно (см. Код ниже).*

Это должно сработать.

imagePickerController = [[UIImagePickerController alloc] init];
imagePickerController.delegate = self;
imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

CGFloat width = CGRectGetWidth(self.view.bounds);
CGFloat height = CGRectGetHeight(self.view.bounds);

UIViewController *containerController = [[UIViewController alloc] init];
containerController.contentSizeForViewInPopover = CGSizeMake(width, height);

[containerController.view addSubview:imagePickerController.view];



if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
    Class cls = NSClassFromString(@"UIPopoverController");
    if (cls != nil) {

        popoverController = [[UIPopoverController alloc] initWithContentViewController:containerController];

        [popoverController presentPopoverFromRect:selectedRect inView:self.view permittedArrowDirections:4 animated:YES];

        [imagePickerController.view setFrame:containerController.view.frame];

        [containerController release];

    }

Также, в вашем контроллере добавьте это, чтобы сбросить кадры, когда происходит вращение:

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {

    [imagePickerController.view setFrame:imagePickerController.view.superview.frame];
}
1 голос
/ 03 сентября 2012

Вышеупомянутый подход работает с iOS 5 и выше, но на iOS 4 и более ранних версиях невозможно добавить UIImagePickerController в качестве подпредставления и затем показать его. Он всегда должен быть представлен как ModalViewController.

0 голосов
/ 20 ноября 2012

Попробуй это. Повторное размещение одного решения, которое я нашел с помощью [currentDevice endGeneratingDeviceOrientationNotifications]

UIImagePickerController *picker = [[[UIImagePickerController alloc] init] autorelease]; 
picker.sourceType = UIImagePickerControllerSourceTypeCamera;  
picker.delegate = self;

// Display the camera.
[self presentModalViewController:picker animated:YES];

// Given by default your orientation is in landscape right already
while ([currentDevice isGeneratingDeviceOrientationNotifications])
   [currentDevice endGeneratingDeviceOrientationNotifications];

Источник: Отключить вращение в UIImagePicker

...