Приложение доступно только для портретной ориентации, но UIImagePickerController вращается в iOS6

Обратите внимание, что ответ ниже - не работает для iOS6, поэтому мне все еще нужен ответ!

Мое приложение работает только в портретном режиме.

Однако, если я встраиваю UIImagePickerController внутрь как подпредставление и поворачиваю устройство, верхняя и нижняя полоски остаются в том же месте, однако UIImagePickerController действительно вращается.

Как я могу предотвратить его вращение?

Это код:

    [self.view.window addSubview:self.imagePickerController.view];
    self.imagePickerController.showsCameraControls = NO; 
    self.imagePickerController.view.frame = CGRectMake(0, 90, 320, 320);
    self.imagePickerController.allowsEditing = NO;

ИЗМЕНЕНО

Я использую iOS6, где shouldAutorotate не вызывается


person Dejell    schedule 21.01.2013    source источник
comment
Взгляните на: stackoverflow.com/questions/538041/   -  person C0D3    schedule 28.02.2014


Ответы (4)


Добавьте эту UIImagePickerController категорию в свой класс,

@interface UIImagePickerController(Nonrotating)
- (BOOL)shouldAutorotate;
@end

@implementation UIImagePickerController(Nonrotating)

- (BOOL)shouldAutorotate {

  return NO;
}

@end
person Anusha Kottiyal    schedule 21.01.2013
comment
Что вы имеете в виду, говоря о добавлении в свой класс? Может быть, это отдельный файл? если да - как я к этому отношусь? - person Dejell; 21.01.2013
comment
Не работает. Когда я поворачиваю iPhone, также вращается UIImagePickerController. Он не слушает ни один из методов - person Dejell; 21.01.2013
comment
@Odelya Вы добавили UIImagePickerControllerDelegate в файл .h ?? - person Anusha Kottiyal; 21.01.2013
comment
Конечно! didFinishPickingMediaWithInfo вызывается после захвата изображения - person Dejell; 21.01.2013
comment
Я думаю, что stackoverflow.com/questions / 12775265 / мне поможет - person Dejell; 21.01.2013
comment
Вы хотите исправить свой ответ, чтобы я мог выбрать его? Поскольку я не понимаю, как использовать willRotateToInterfaceOrientation - person Dejell; 21.01.2013
comment
@Odelya Я раньше не использовал эту willRotateToInterfaceOrientation .. Я попробую .. Вы проверяли, что удалили ненужные ориентации из info.plist.? - person Anusha Kottiyal; 21.01.2013

включите следующее в свой контроллер, это будет работать, я просто создаю категорию UIImagePickerController

@interface UIImagePickerController (private)

- (BOOL)shouldAutorotate;
- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation;
- (NSUInteger)supportedInterfaceOrientations;
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;

@end


@implementation UIImagePickerController (Private)

- (NSUInteger)supportedInterfaceOrientations {

    return UIInterfaceOrientationMaskPortrait;
}

- (BOOL)shouldAutorotate {

    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{  
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
person junaidsidhu    schedule 21.01.2013
comment
просто вставьте его в файл ViewController.m перед @implementation. - person junaidsidhu; 21.01.2013
comment
Вы имеете в виду, что я могу просто создать 2 файла h. и м., разместите их в любом месте проекта и все заработает? - person Dejell; 21.01.2013
comment
нет нет, включите его в тот контроллер, где вы реализуете imagePickerController - person junaidsidhu; 21.01.2013
comment
Не работает. Когда я поворачиваю iPhone, также вращается UIImagePickerController. Он не слушает ни один из методов - person Dejell; 21.01.2013
comment
Он останавливается на методе supportedInterfaceOrientations (в точке останова), но только когда он открыт. - person Dejell; 21.01.2013
comment
Это не останавливается на shouldAutorotate или любом другом - person Dejell; 21.01.2013
comment
Я думаю, что stackoverflow.com/questions / 12775265 / мне поможет - person Dejell; 21.01.2013
comment
Вы хотите отредактировать ответ на ios6, чтобы я мог отметить его как истинный? - person Dejell; 21.01.2013
comment
Ну вот в чем вопрос - я пытался добавить этот метод, но у меня он не сработал. Ищу ответ, который будет работать в iOS6 - person Dejell; 21.01.2013
comment
Разве вам не нужен @end в конце реализации? - person C0D3; 28.02.2014

Одна из возможностей - отменить

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation;

метод UIImagePickerController. Я не уверен, что это лучший вариант, но он сработает.

Итак, если вы хотите, чтобы ваш UIImagePickerController был повернут в портретную ориентацию, используйте следующий код

@interface PortraitUIImagePickerController : UIImagePickerController

@end

И реализация должна выглядеть следующим образом

@implementation PortraitUIImagePickerController

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation
{
    return UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
}

@end
person who9vy    schedule 21.01.2013
comment
Я использую iOS6, и shouldAutorotateToInterfaceOrientation устарела - person Dejell; 21.01.2013

Категория в ответе, получившем наибольшее количество голосов, работает, но поскольку не рекомендуется использовать категории, вы также можете создать подкласс UIImagePickerController и использовать его.

Если вы хотите избежать вращения UIImagePickerController, добавьте следующий класс

UINonRotatableImagePickerController.h

@interface UINonRotatableImagePickerController : UIImagePickerController

@end

UINonRotatableImagePickerController.m

@implementation UINonRotatableImagePickerController

- (BOOL)shouldAutorotate
{
    return NO;
}

@end

Вы должны изменить класс UIImagePicker в раскадровке, чтобы использовать UILandscapeImagePickerController, или, если вы выделяете его в коде, измените

UIImagePickerController *picker = [[UIImagePickerController alloc] init];

to

UIImagePickerController *picker = [[UINonRotatableImagePickerController alloc] init];

и включите UINonRotatableImagePickerController.h в свой код.

person masam    schedule 03.04.2014
comment
imagePicker всегда портретный и никогда не поддерживает подклассы. Он вращается только в том случае, если средство выбора изображения добавлено в качестве подпредставления, потому что оно вращается из-за супервизора, а не самого себя. - person AsifHabib; 08.04.2014
comment
Возможно, это так и в случае с iPhone, но у меня есть полноэкранный выбор изображений в альбомной ориентации для iPad. - person masam; 10.04.2014