Кнопки наложения UIImagePickerController не запускаются

У меня есть UIImagePickerController типа камеры, когда пользователь попадает на страницу. Я поместил пользовательское наложение камеры поверх UIImagePickerController, но ни одно из событий кнопки не срабатывает. Я знаю, что большая часть этого кода взята из базового кода Apple, поэтому я озадачен тем, что происходит.

@interface TakePhotoViewController : UIImagePickerController <UIImagePickerControllerDelegate, UINavigationControllerDelegate>
...

- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
if (self.capturedImages.count > 0)
{
    [self.capturedImages removeAllObjects];
}

self.sourceType = sourceType;
self.delegate = self;

if (sourceType == UIImagePickerControllerSourceTypeCamera)
{
    /*
     The user wants to use the camera interface. Set up our custom overlay view for the camera.
     */
    self.showsCameraControls = NO;

    /*
     Load the overlay view from the OverlayView nib file. Self is the File's Owner for the nib file, so the overlayView outlet is set to the main view in the nib. Pass that view to the image picker controller to use as its overlay view, and set self's reference to the view to nil.
     */
    [[NSBundle mainBundle] loadNibNamed:@"CameraOverlay" owner:self options:nil];
    float scale = [self getScaleForFullScreen];
    self.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
    self.overlayView.frame = self.cameraOverlayView.frame;
    self.cameraOverlayView = self.overlayView;
    self.overlayView = nil;
}

}

Владельцем CameraOverlay является TakePhotoViewController. Одна из кнопок внутри CameraOverlay отправляет событие Touch Up Inside на функцию розетки, указанную ниже. Ниже приведен код в TakePhotoViewController, прикрепленный к кнопке, из которого не запускаются логи:

- (IBAction)outlet:(id)sender {
NSLog(@"outlet");
}

2 ответа

Решение

Проблема в этой строке:

self.overlayView.frame = self.cameraOverlayView.frame;

наш cameraOverlayView ноль; у него нет рамки, потому что он еще даже не существует. Итак, мы даем overlayView нулевой кадр. Это безразмерно. Кнопка появляется, но она имеет суперпредставление нулевого размера и поэтому не может быть нажата.

Теперь вы можете спросить, почему это так? Это из-за того, как сенсорная доставка работает в iOS. Чтобы быть осязаемым, суперпредставление подпредставления также должно быть осязаемым, потому что суперпредставление проверено на прикосновение до прикосновения. Но представление нулевого размера не дотрагивается: ваше прикосновение пропускает overlayView, так что он также пропускает кнопку.

Решение может быть так же просто, как дать overlayView разумный реальный кадр. Также могут возникнуть проблемы с синхронизацией, когда вы делаете это (например, может случиться так, что вы не сможете установить рамку, пока не появится сборщик изображений - viewWillAppear:), но в любом случае это место для начала.

Я столкнулся с другим способом, которым это может произойти, по крайней мере, если вы не создаете подкласс UIImagePickerController (Apple говорит, что это не подкласс).

Я создал вспомогательный класс, который создает, настраивает и представляет UIImagePickerController в методе show() вспомогательного класса. Когда я создал вспомогательный класс, я сделал это просто внутри метода, думая, что UIImagePickerController будет отображаться модально и синхронно.

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

Поэтому для моего исправления мне просто нужно было создать свой вспомогательный класс как свойство-член класса, который хочет вызвать вспомогательную функцию show().

Другие вопросы по тегам