Image Move & Resize не работает при использовании пользовательского оверлея камеры iPhone SDK 3.1+

Раньше я использовал старый метод добавления оверлея на экран камеры, и это сработало. Однако с выходом 3.1 Apple настаивает на том, чтобы я использовал API для добавления оверлея. Я быстро заставил наложение работать, но кажется, что если я использую настраиваемый оверлей, то экран перемещения и изменения размера не реагирует, я могу только использовать или переснимать, на самом деле не могу изменять размер и перемещать. Код, который я использую, приведен ниже. Я пробовал несколько вариантов, но единственное, что на самом деле позволяет перемещать и изменять размер, - это удалить строку, которая добавляет настраиваемый вид наложения.

Любые идеи?

UIImage *image = [UIImage imageNamed:@"camera-template-long.png"];
UIImageView *imgView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)] ;
imgView.image = image;

UIView *overlayView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
overlayView.opaque = NO;
[overlayView addSubview:imgView];

UIImagePickerController* picker = [[UIImagePickerController alloc] init];
picker.sourceType = UIImagePickerControllerSourceTypeCamera;        
picker.showsCameraControls = YES;
picker.cameraOverlayView = overlayView;
picker.delegate = self;
picker.allowsEditing = YES;

[self presentModalViewController:picker animated:YES];

person Jeremie Weldin    schedule 02.01.2010    source источник


Ответы (3)


Установите оба свойства _1 _ / _ 2_ на NO, подготовьте исходное представление к cameraOverlayView и используйте метод takePicture.

Затем imagePickerController:didFinishPickingMediaWithInfo: будет вызываться напрямую.


Пожалуйста, попробуйте следующий код:

- (void)foo {
  UIImagePickerController *controller = [[[UIImagePickerController alloc] init] autorelease]; 
  controller.sourceType = UIImagePickerControllerSourceTypeCamera; 
  controller.cameraOverlayView = self.cameraOverlay; 
  [self performSelector:@selector(moveOverlayViewToSublayer:) withObject:controller afterDelay:0.1f]; 
  controller.delegate = self; 
  [self presentModalViewController:controller animated:YES]; 
}
- (void) moveOverlayViewToSublayer:(UIImagePickerController*)controller { 
  CALayer *aLayer = self.cameraOverlay.layer.superlayer; 
  controller.cameraOverlayView = nil; 
  [aLayer addSublayer:self.cameraOverlay.layer]; 
}

Надеюсь, все будет хорошо.

person KatokichiSoft    schedule 06.01.2010
comment
Это все еще позволяет изменять размер и перемещать? - person Jeremie Weldin; 12.01.2010
comment
Извините, я неправильно понял ваш вопрос. Ваш вопрос: как активировать операцию изменения размера и кадрирования при добавлении пользовательского оверлея? Я изменил свой ответ. - person KatokichiSoft; 13.01.2010
comment
Это сработало, с небольшими изменениями, мне нужно было оставить для allowEditing и showsCameraControls значение YES. Спасибо. Теперь посмотрим, одобрит ли это Apple. Я получаю предупреждение, что CALayer addSublayer недействителен. - person Jeremie Weldin; 05.04.2010
comment
Я бы сказал нет. Это сработало не для всех версий, и выбранный ответ действительно сделал то, что мне нужно. - person Jeremie Weldin; 21.04.2012
comment
@Katokichi: Как получить размер оверлейного кадра при перемещении нового кадра? - person Ram; 02.04.2013

Вся проблема исчезает, как только вы используете [overlayView setUserInteractionEnabled:NO];, чтобы запретить представлению оверлея обрабатывать ввод.

person Jeremie Weldin    schedule 11.10.2010
comment
тогда зачем нужен оверлей? Я попытался сделать то, что было предложено выше, после этого оверлей не появится. - person tom; 20.04.2012
comment
Мне нужно только наложение, чтобы отобразить рамку поверх изображения с камеры в реальном времени. Мне не нужно взаимодействие с пользователем в моем оверлее. - person Jeremie Weldin; 21.04.2012

http://www.techques.com/question/1-10178214/cameraOverlayView-prevents-editing-with-allowsEditing

У меня это отлично работает. Я пытался отключить userInteractionEnabled, но тщетно.

person Kuo-chung Hsu    schedule 05.02.2014