7

ジェスチャーを使用して画像を操作するために使用するPhotoBoothControllerというクラスがあります。iPhoneで実行すると正常に動作します。ただし、iPadで実行すると、UIPopoverController内にPhotoBoothControllerが表示されます。画像はきれいに見えますが、ジェスチャーが認識されていないように見えるため、操作できません。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]はそれをするかもしれないと思ったが、それは違いを生むようには見えない。

どんなアドバイスでも大歓迎です、ありがとう。

更新:コメントごとにコードを追加

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

2 に答える 2

3

私は同様のアプリケーションに取り組んでおり、キャンバス上の画像を簡単に操作できます。

1) キャンバスのuserInteractionEnabledプロパティがYESに設定されているかどうかを確認します。
2) ジェスチャーをキャンバスではなく ImageView に追加してみてください。(私はあなたが画像をズームしたり、回転させたり、スワイプしたりしたいと思っています)。

于 2012-05-14T06:30:17.340 に答える
1

いくつかの推測:

  1. これは、viewDidLoadcavas プロパティが設定される前にメソッドが呼び出されたためですか? この場合、 などの別の方法で現在のポップオーバーの後に認識エンジンを追加することを試みることができますviewDidAppear

  2. また、キーは UIPopoverController がポップオーバー外の他のビューへの相互作用を許可することであることに同意します。したがって、メソッド[canvas becomeFirstResponder];の最後に移動して、ここで試してみることをお勧めします。これは、実際に認識機能を self.view に追加するためです。viewDidLoadPhotoBoothControllerself.view becomeFirstResponder

于 2012-05-08T17:17:01.663 に答える