iPad 中的 UIPanGestureRecognizer 问题

发布于 2024-11-03 05:43:19 字数 2899 浏览 3 评论 0原文

在我的应用程序中,我试图移动弹出的子视图。这是使用苹果中提供的 UIPanGestureRecognizer 和手势识别功能来完成的这个链接

所以我遇到的问题是,当我单击按钮图像并尝试移动视图时,它不会移动视图。仅当我单击该按钮,然后单击它并移动它时,该功能才起作用。只有这样它才会移动视图。

我想知道我做错了什么。

这是我添加此功能的按钮代码

UIButton *moveButton = [[UIButton alloc] initWithFrame:CGRectMake(5, 1, 30, 30)];
[moveButton addTarget:self         action:@selector(moveButtonClick:)forControlEvents:UIControlEventTouchDown];
[moveButton setBackgroundImage:[UIImage imageNamed: @"moveButton.png"] forState:UIControlStateNormal];
[customView addSubview:moveButton];
[moveButton release];

,这是我用于应用程序识别平移手势的代码

-(void) moveButtonClick: (id) sender
 {
[self addGestureRecognizersToPiece:self.view];
 }

 // shift the piece's center by the pan amount
 // reset the gesture recognizer's translation to {0, 0} after applying so the next callback  is a delta from the current position
 - (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
UIView *piece = [gestureRecognizer view];

[self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
    CGPoint translation = [gestureRecognizer translationInView:[piece superview]];

    [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
    [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
}
}

// adds a set of gesture recognizers to one of our piece subviews
- (void)addGestureRecognizersToPiece:(UIView *)piece
{
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panPiece:)];
[panGesture setDelegate:self];
[panGesture setMaximumNumberOfTouches:1];
[piece addGestureRecognizer:panGesture];
[panGesture release];

}


// scale and rotation transforms are applied relative to the layer's anchor point
// this method moves a gesture recognizer's view's anchor point between the user's fingers
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
{
    UIView *piece = gestureRecognizer.view;
    CGPoint locationInView = [gestureRecognizer locationInView:piece];
    CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

    piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
    piece.center = locationInSuperview;
}
}

// UIMenuController requires that we can become first responder or it won't display
- (BOOL)canBecomeFirstResponder
{
return YES;
}

如果有人可以帮助我解决这个问题,那就太好了。

更新:问题已解决。请查看下面提供的答案。

in my app, I am trying to move a subview which I popup. This is am doing using UIPanGestureRecognizer and gesture recognizing functions provided by apple in this link

So the problem I get is that when I click on the button image and try to move the view, it does not move the view. The functionality works only when I click the button, and then click it and move it. only then does it move the view.

I would like to know what I am doing wrong.

Here is the button code to which I add this functionality

UIButton *moveButton = [[UIButton alloc] initWithFrame:CGRectMake(5, 1, 30, 30)];
[moveButton addTarget:self         action:@selector(moveButtonClick:)forControlEvents:UIControlEventTouchDown];
[moveButton setBackgroundImage:[UIImage imageNamed: @"moveButton.png"] forState:UIControlStateNormal];
[customView addSubview:moveButton];
[moveButton release];

and here is the code I use for the app to recognize the pan gesture

-(void) moveButtonClick: (id) sender
 {
[self addGestureRecognizersToPiece:self.view];
 }

 // shift the piece's center by the pan amount
 // reset the gesture recognizer's translation to {0, 0} after applying so the next callback  is a delta from the current position
 - (void)panPiece:(UIPanGestureRecognizer *)gestureRecognizer
{
UIView *piece = [gestureRecognizer view];

[self adjustAnchorPointForGestureRecognizer:gestureRecognizer];

if ([gestureRecognizer state] == UIGestureRecognizerStateBegan || [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
    CGPoint translation = [gestureRecognizer translationInView:[piece superview]];

    [piece setCenter:CGPointMake([piece center].x + translation.x, [piece center].y + translation.y)];
    [gestureRecognizer setTranslation:CGPointZero inView:[piece superview]];
}
}

// adds a set of gesture recognizers to one of our piece subviews
- (void)addGestureRecognizersToPiece:(UIView *)piece
{
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panPiece:)];
[panGesture setDelegate:self];
[panGesture setMaximumNumberOfTouches:1];
[piece addGestureRecognizer:panGesture];
[panGesture release];

}


// scale and rotation transforms are applied relative to the layer's anchor point
// this method moves a gesture recognizer's view's anchor point between the user's fingers
- (void)adjustAnchorPointForGestureRecognizer:(UIGestureRecognizer *)gestureRecognizer 
{
if (gestureRecognizer.state == UIGestureRecognizerStateBegan) 
{
    UIView *piece = gestureRecognizer.view;
    CGPoint locationInView = [gestureRecognizer locationInView:piece];
    CGPoint locationInSuperview = [gestureRecognizer locationInView:piece.superview];

    piece.layer.anchorPoint = CGPointMake(locationInView.x / piece.bounds.size.width, locationInView.y / piece.bounds.size.height);
    piece.center = locationInSuperview;
}
}

// UIMenuController requires that we can become first responder or it won't display
- (BOOL)canBecomeFirstResponder
{
return YES;
}

It would be really great if someone could help me out in this.

UPDATE : Problem Solved. Look at the answer provided below.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

放肆 2024-11-10 05:43:19

我解决了问题...显然使用按钮来执行我需要的操作,确实需要我单击它两次,然后只执行平移操作。所以我删除了它并添加了一个图像并添加了手势识别器。

这是更新的代码...

图像的代码 -

// Image which allows subview to be moved around
CGRect myImageRect = CGRectMake(5, 1, 30, 30);
UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"moveButton.png"]];
myImage.opaque = YES;
myImage.userInteractionEnabled = YES;
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self        action:@selector(panPiece:)];
[panGesture setDelegate:self];
[panGesture setMaximumNumberOfTouches:1];
UIView *piece = self.view;
[piece addGestureRecognizer:panGesture];
[panGesture release];
[customView addSubview:myImage];
[myImage release];

之后我删除了按钮代码并删除了按钮的动作识别器..除此之外,其余的代码是相同的并且工作正常...

I solved the problem... apparently using the button to perform the action I needed, will indeed require me to click on it twice and then only perform the pan action. So I removed it and added an Image and added gesture recognizer to it.

Here is the updated code...

The code for the Image -

// Image which allows subview to be moved around
CGRect myImageRect = CGRectMake(5, 1, 30, 30);
UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect];
[myImage setImage:[UIImage imageNamed:@"moveButton.png"]];
myImage.opaque = YES;
myImage.userInteractionEnabled = YES;
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:self        action:@selector(panPiece:)];
[panGesture setDelegate:self];
[panGesture setMaximumNumberOfTouches:1];
UIView *piece = self.view;
[piece addGestureRecognizer:panGesture];
[panGesture release];
[customView addSubview:myImage];
[myImage release];

After this I removed the button code and removed the action recognizer for the button.. other than that, the rest of the code is the same and it works fine...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文