7

Tengo una clase llamada PhotoBoothController que utilizo para manipular una imagen usando gestos. Funciona bien cuando lo ejecuto en iPhone. Sin embargo, cuando lo ejecuto en iPad, muestro el PhotoBoothController dentro de un UIPopoverController. La imagen parece estar bien, sin embargo no puedo manipularla ya que mis gestos no parecen ser reconocidos. No estoy seguro de cómo hacer que UIPopoverController tome el control de los gestos.Perdiendo Reconocedores de Gestos en UIPopoverController

presento los popovercontroller y configurar la vista de este modo:

- (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]; 
} 

pensé [canvas becomeFirstResponder] podrían hacerlo, pero no parece hacer una diferencia.

Cualquier consejo mucho aprecio, gracias.

ACTUALIZACIÓN: añadir código según comentario

- (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

Agregue el código utilizado para adjuntar el (los) reconocedor (es) de gestos a su UIPopoverController – Stavash

+0

@stavash done - el código está en la clase PhotoBoothController. ¡Gracias! – Smikey

+0

Este es un tema interesante. ¿Qué le parece agregar los gestos externos al UIPopoverController? Sé que requiere bastantes cambios, pero no tengo ninguna otra sugerencia en este momento ... – Stavash

Respuesta

1

algunas suposiciones:

  1. es esto porque viewDidLoad método de haber sido llamado antes ha establecido la propiedad cavas? En este caso, puede tratar de agregar reconocedores después de popover presente en otro método como viewDidAppear.

  2. También estoy de acuerdo en que la clave puede ser que UIPopoverController permite la interacción con otras vistas fuera del popover. Así que sugiero que mueva [canvas becomeFirstResponder]; al final del método viewDidLoad en PhotoBoothController y pruebe aquí porque realmente agrega reconocedores a self.view.

3

Estoy trabajando en una aplicación similar, y puedo manipular fácilmente las imágenes en el lienzo.

1) Compruebe si el userInteractionEnabled propiedad del lienzo se establece en .
2) Puede intentar agregar los gestos a ImageView en lugar de al lienzo. (Supongo que quieres hacer zoom, rotar y deslizar las imágenes).

Cuestiones relacionadas