iOS:“recognizer.view.center = CGPointMake(...”的错误效果

Posted

技术标签:

【中文标题】iOS:“recognizer.view.center = CGPointMake(...”的错误效果【英文标题】:iOS: Wrong effect with "recognizer.view.center = CGPointMake(..." 【发布时间】:2013-04-17 12:31:40 【问题描述】:

当用户释放按钮时,我使用 locationInView 来设置按钮的位置。释放后,我给出了之前存储的位置,但实际上,我的按钮并没有回到正确的位置。

这是我的代码:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer

    CGPoint translation = [recognizer translationInView:self.view];
    recognizer.view.center = CGPointMake(recognizer.view.center.x + translation.x,
                                         recognizer.view.center.y + translation.y);

    [recognizer setTranslation:CGPointMake(0, 0) inView:self.view];

    static CGPoint startLocation;

    if (recognizer.state == UIGestureRecognizerStateBegan) 
        startLocation = [recognizer locationInView:self.view];
        NSLog(@"Began: %d" @"-" @"%d", (int)startLocation.x , (int)startLocation.y);
    

    if (recognizer.state == UIGestureRecognizerStateEnded)
    
        NSLog(@"Ended Bef: %d" @"-" @"%d", (int)startLocation.x, (int)startLocation.y);
        recognizer.view.center =  CGPointMake(startLocation.x, startLocation.y);

        startLocation = [recognizer locationInView:self.view];
        NSLog(@"Ended Aft: %d" @"-" @"%d", (int)startLocation.x, (int)startLocation.y);

    

 

其实指令:

recognizer.view.center =  CGPointMake(startLocation.x, startLocation.y);

给出错误的效果。有人知道为什么吗?

【问题讨论】:

我已经更新了代码。谢谢。 当用户拖动按钮时,我存储按钮的初始位置,当用户在屏幕的任意位置释放按钮时,我想将按钮设置回起始位置。 谢谢。 static 的缺失让我很困惑。 为什么是罗布?在这种情况下使用静态是一个糟糕的选择吗? 不,在您原来的问题中,您省略了static。因此,我看不出该值是如何为您保存的。有了static,这一切都变得有意义了。 【参考方案1】:

一些想法:

    我建议在对 center 进行任何更改之前确保捕获 startLocation

    您将用户触摸的位置用于startLocation。你真的应该用recognizer.viewcenter 来初始化它。用户不太可能在按钮的中心精确地开始他们的手势。因此,您不太可能回到原来的位置。

有点不相关,但是:

    UIGestureRecognizerStateEnded 子句中重置recognizer.viewcenter 时不需要使用CGMakePoint。如果你真的想要,你可以使用CGPointMake,但这不是必需的。如果需要,您可以使用startLocation

    您可能希望将视图返回到 startLocation 的动画。让它立即去那里是不和谐的。

    顺便说一句,如果您保存了startLocation,则无需不断重置translation。只需使用startLocation 加上translation。对我来说似乎更清楚,但显然这是主观的。

    我个人认为NSStringFromCGPoint 在记录CGPoint 结构时非常有用。

所以,我建议:

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer

    static CGPoint startLocation;

    if (recognizer.state == UIGestureRecognizerStateBegan)
    
        startLocation = recognizer.view.center;
        NSLog(@"Began: %@", NSStringFromCGPoint(startLocation));
    

    CGPoint translation = [recognizer translationInView:self.view];

    recognizer.view.center = CGPointMake(startLocation.x + translation.x,
                                         startLocation.y + translation.y);

    if (recognizer.state == UIGestureRecognizerStateEnded)
    
        NSLog(@"Ended Bef: %@", NSStringFromCGPoint(startLocation));

        [UIView animateWithDuration:0.25
                         animations:^
                             recognizer.view.center = startLocation;
                         ];

        CGPoint finalLocation = [recognizer locationInView:self.view];
        NSLog(@"Ended Aft: %@", NSStringFromCGPoint(finalLocation));
    

【讨论】:

哇啊啊啊,你真是个天才!!!!!!!!!许多thx,此外还有所有解释!再次感谢 Rob! 我真的需要进一步练习才能了解框架的强大!非常感谢!

以上是关于iOS:“recognizer.view.center = CGPointMake(...”的错误效果的主要内容,如果未能解决你的问题,请参考以下文章

IO复用阻塞IO非阻塞IO同步IO异步IO

四种IO模型‘阻塞IO/非阻塞IO/信号驱动IO/异步IO‘

5种IO模型阻塞IO和非阻塞IO同步IO和异步IO

网络IO模型:同步IO和异步IO,阻塞IO和非阻塞IO

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别

同步IO异步IO阻塞IO非阻塞IO之间的联系与区别