UIPanGestureRecognizer班有几个例子.例如,我已经读了this,但我仍然无法使用它...

在我正在处理的nib文件中,我有一个UIView(图像上的白色矩形),我希望与该类一起拖动:

在此处输入图像描述

在我的心里.我放置的m文件:

- (void)setTranslation:(CGPoint)translation inView:(UIView *)view
{
    NSLog(@"Test to see if this method gets executed");
}

当我把鼠标拖动到UIView上时,这个方法不会被执行.我还try 过:

- (void)pan:(UIPanGestureRecognizer *)gesture
{
    NSLog(@"testing");
}

而且这个方法也不会被执行.也许我错了,但我认为这个方法应该像- (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event方法一样工作,我只需要放置那个方法,只要有触碰,它就会被调用.

我做错了什么?也许我必须和这种方法联系起来?如果是这样,我该怎么做?

推荐答案

我找到了教程Working with UIGestureRecognizers,我想这就是我想要的.它帮助我想出了以下解决方案:

-(IBAction) someMethod {
    UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(move:)];
    [panRecognizer setMinimumNumberOfTouches:1];
    [panRecognizer setMaximumNumberOfTouches:1];
    [ViewMain addGestureRecognizer:panRecognizer];
    [panRecognizer release];
}

-(void)move:(UIPanGestureRecognizer*)sender {
    [self.view bringSubviewToFront:sender.view];
    CGPoint translatedPoint = [sender translationInView:sender.view.superview];

    if (sender.state == UIGestureRecognizerStateBegan) {
        firstX = sender.view.center.x;
        firstY = sender.view.center.y;
    }


    translatedPoint = CGPointMake(sender.view.center.x+translatedPoint.x, sender.view.center.y+translatedPoint.y);

    [sender.view setCenter:translatedPoint];
    [sender setTranslation:CGPointZero inView:sender.view];

    if (sender.state == UIGestureRecognizerStateEnded) {
        CGFloat velocityX = (0.2*[sender velocityInView:self.view].x);
        CGFloat velocityY = (0.2*[sender velocityInView:self.view].y);

        CGFloat finalX = translatedPoint.x + velocityX;
        CGFloat finalY = translatedPoint.y + velocityY;// translatedPoint.y + (.35*[(UIPanGestureRecognizer*)sender velocityInView:self.view].y);

        if (finalX < 0) {
            finalX = 0;
        } else if (finalX > self.view.frame.size.width) {
            finalX = self.view.frame.size.width;
        }

        if (finalY < 50) { // to avoid status bar
            finalY = 50;
        } else if (finalY > self.view.frame.size.height) {
            finalY = self.view.frame.size.height;
        }

        CGFloat animationDuration = (ABS(velocityX)*.0002)+.2;

        NSLog(@"the duration is: %f", animationDuration);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:animationDuration];
        [UIView setAnimationCurve:UIViewAnimationCurveEaseOut];
        [UIView setAnimationDelegate:self];
        [UIView setAnimationDidStopSelector:@selector(animationDidFinish)];
        [[sender view] setCenter:CGPointMake(finalX, finalY)];
        [UIView commitAnimations];
    }
}

Objective-c相关问答推荐

使用 NSMutableString 附加到文件的末尾

从 C# 到 Objective C 会有多大的飞跃

多个 WKWebView 之间的 Cookie 共享

如何声明仅调试语句

如何从 Appdelegate 显示 UIAlertController

在 UITableViewCells 上显示复制弹出窗口的简单方法,如地址簿应用程序

带有语法高亮的 UITextView

NSFileManager 唯一的文件名

无法编译连接:错误是什么意思?

适用于 ios 的 360° 全景库

NSUInteger 不应该在格式字符串中使用吗?

iOS 中 textField 上的Electron邮件验证

如何从 AVPlayer(不是 AVAudioPlayer)获取持续时间?

如何将 NSNumber 转换和比较为 BOOL?

对 NSTimer 目标的弱引用以防止保留循环

UICollectionView 自动调整高度

cellForRowAtIndexPath 是如何工作的?

创建 NSTextField标签的示例代码?

如何创建 .dSYM 文件?

Block 隐式保留'self';明确提及touch以表明这是预期行为