7

У меня есть класс под названием PhotoBoothController, который я использую для управления изображением с помощью жестов. Он отлично работает, когда я запускаю его на iPhone. Однако, когда я запускаю его на iPad, я показываю PhotoBoothController внутри UIPopoverController. Изображение выглядит прекрасно, но я не могу манипулировать им, так как мои жесты не отображаются. Я не уверен, как заставить UIPopoverController взять под контроль жесты.Потерятор распознавания жестов в UIPopoverController

Я представляю popovercontroller и настроить вид таким образом:

- (void)presentPhotoBoothForPhoto:(UIImage *)photo button:(UIButton *)button { 

    //Create a photoBooth and set its contents 
    PhotoBoothController *photoBoothController = [[PhotoBoothController alloc] init]; 
    photoBoothController.photoImage.image = [button backgroundImageForState:UIControlStateNormal]; 

    //set up all the elements programmatically. 
    photoBoothController.view.backgroundColor = [UIColor whiteColor]; 

    //Add frame (static) 
    UIImage *frame = [[UIImage imageNamed:@"HumptyLine1Frame.png"] adjustForResolution]; 
    UIImageView *frameView = [[UIImageView alloc] initWithImage:frame]; 
    frameView.frame = CGRectMake(50, 50, frame.size.width, frame.size.height); 
    [photoBoothController.view addSubview:frameView]; 

    //Configure image 
    UIImageView *photoView = [[UIImageView alloc] initWithImage:photo]; 
    photoView.frame = CGRectMake(50, 50, photo.size.width, photo.size.height); 
    photoBoothController.photoImage = photoView; 

    //Add canvas 
    UIView *canvas = [[UIView alloc] initWithFrame:frameView.frame]; 
    photoBoothController.canvas = canvas; 
    [canvas addSubview:photoView]; 
    [canvas becomeFirstResponder]; 

    [photoBoothController.view addSubview:canvas]; 
    [photoBoothController.view bringSubviewToFront:frameView]; 

    //resize the popover view shown in the current view to the view's size 
    photoBoothController.contentSizeForViewInPopover = CGSizeMake(frameView.frame.size.width+100, frameView.frame.size.height+400); 

    self.photoBooth = [[UIPopoverController alloc] initWithContentViewController:photoBoothController]; 
    [self.photoBooth presentPopoverFromRect:button.frame 
            inView:self.view 
        permittedArrowDirections:UIPopoverArrowDirectionAny 
            animated:YES]; 
} 

Я думал [canvas becomeFirstResponder] может это сделать, но не похоже, чтобы сделать разницу.

Любые советы очень ценю, спасибо.

UPDATE: добавление кода в соответствии с комментарием

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    if (!_marque) { 
    _marque = [CAShapeLayer layer]; 
    _marque.fillColor = [[UIColor clearColor] CGColor]; 
    _marque.strokeColor = [[UIColor grayColor] CGColor]; 
    _marque.lineWidth = 1.0f; 
    _marque.lineJoin = kCALineJoinRound; 
    _marque.lineDashPattern = [NSArray arrayWithObjects:[NSNumber numberWithInt:10],[NSNumber numberWithInt:5], nil]; 
    _marque.bounds = CGRectMake(photoImage.frame.origin.x, photoImage.frame.origin.y, 0, 0); 
    _marque.position = CGPointMake(photoImage.frame.origin.x + canvas.frame.origin.x, photoImage.frame.origin.y + canvas.frame.origin.y); 
    } 
    [[self.view layer] addSublayer:_marque]; 

    UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)]; 
    [pinchRecognizer setDelegate:self]; 
    [self.view addGestureRecognizer:pinchRecognizer]; 

    UIRotationGestureRecognizer *rotationRecognizer = [[UIRotationGestureRecognizer alloc] initWithTarget:self action:@selector(rotate:)]; 
    [rotationRecognizer setDelegate:self]; 
    [self.view addGestureRecognizer:rotationRecognizer]; 

    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)]; 
    [panRecognizer setMinimumNumberOfTouches:1]; 
    [panRecognizer setMaximumNumberOfTouches:1]; 
    [panRecognizer setDelegate:self]; 
    [canvas addGestureRecognizer:panRecognizer]; 

    UITapGestureRecognizer *tapProfileImageRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapped:)]; 
    [tapProfileImageRecognizer setNumberOfTapsRequired:1]; 
    [tapProfileImageRecognizer setDelegate:self]; 
    [canvas addGestureRecognizer:tapProfileImageRecognizer]; 

} 

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 
    return ![gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]] && ![gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]; 
} 
+0

Пожалуйста, добавьте код, используемый для прикрепления распознавателя жестов к вашему UIPopoverController – Stavash

+0

@stavash done - код находится в классе PhotoBoothController. Благодаря! – Smikey

+0

Это интересная проблема. Как насчет добавления жестов извне в UIPopoverController? Я знаю, что это требует немалых изменений, но сейчас у меня нет никаких других предложений ... – Stavash

ответ

1

некоторые предположения:

  1. это потому, что viewDidLoad метод был вызван до Cavas свойство было установлено? В этом случае вы можете попытаться добавить распознаватели после текущего popover в другом методе, таком как viewDidAppear.

  2. Я также согласен с тем, что ключ может заключаться в том, что UIPopoverController позволяет взаимодействовать с другими видами за пределами popover. Поэтому я предлагаю переместить [canvas becomeFirstResponder]; в конец метода viewDidLoad в PhotoBoothController и попробуйте self.view becomeFirstResponder, потому что вы действительно добавляете распознаватели в self.view.

3

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

1) Проверьте, если userInteractionEnabled свойство холста устанавливается в YES.
2) Вы можете попробовать добавить жесты к ImageView, а не к холсту. (Я предполагаю, что вы хотите масштабировать, поворачивать n, прокручивать изображения).

Смежные вопросы