【问题标题】:UIPanGestureRecognizer - view dissappears on dragUIPanGestureRecognizer - 拖动时视图消失
【发布时间】:2013-08-03 03:57:11
【问题描述】:

我在使用 UIPanGestureRecognizer 从屏幕顶部移动视图时遇到了一个奇怪的问题。一切都在模拟器中完美运行,但在实际设备上,当我触摸它时,视图消失了。

- (IBAction)handlePan:(UIPanGestureRecognizer *)recognizer {

    CGPoint start;

    if (recognizer.state == UIGestureRecognizerStateBegan) {
        start = [recognizer translationInView:self.view];
        originCenter = recognizer.view.center.y;
    }

    if (recognizer.state == UIGestureRecognizerStateChanged) {
        CGPoint translation = [recognizer translationInView:self.view];
        if (down) {
            if (originCenter + translation.y < self.view.center.y && self.view.center.y + translation.y < self.view.center.y) {
                CGPoint move = CGPointMake(self.view.frame.size.width/2, originCenter-(start.y-translation.y));
                [recognizer.view setCenter:move];
            }
        }else{
            if (originCenter + translation.y < self.view.center.y && originCenter + translation.y > originCenter) {
                CGPoint move = CGPointMake(self.view.frame.size.width/2, originCenter-(start.y-translation.y));
                [recognizer.view setCenter:move];
            }
        }
    }

    if([recognizer state] == UIGestureRecognizerStateEnded  || [recognizer state] == UIGestureRecognizerStateCancelled ){
        if(recognizer.view.center.y > -40){

            [recognizer.view setFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];

            down = TRUE;
        }else{

            [recognizer.view setFrame:CGRectMake(0, 80-self.view.frame.size.height, self.view.frame.size.width, self.view.frame.size.height)];

            down = FALSE;
        }
    }
}

我想到一件事,计算设备上的位置可能存在问题,并且视图移到了屏幕外。这可能吗?

【问题讨论】:

  • 顺便说一句,您在UIGestureRecognizerStateChanged 期间使用down,但直到UIGestureRecognizerStateEnded 才设置它。也许您正在其他地方初始化它,但这是一个奇怪的构造。

标签: iphone ios objective-c


【解决方案1】:

如果不出意外,您应该将 start 设为 static 或 ivar。否则,当您点击UIGestureRecognizerStateChanged 时,start 将不会保留它在UIGestureRecognizerStateBegan 期间的值。

【讨论】:

  • 天哪!现在看起来很明显。非常感谢 :-) 知道为什么它在模拟器中有效,但在设备中无效?
  • @adam 我可以想象许多奇怪的编译器优化中的任何一个,纯粹是偶然的,使其工作。但并非如此可靠,而且我当然永远不会预料到它会起作用,因为未初始化变量的值是未定义的(ARC 中的对象除外,但 CGPoint 不是对象)。顺便说一句,Xcode 的静态分析器(“产品”菜单上的“分析”)很可能会发现这个问题。静态分析器是一个很棒的工具,但未被充分重视。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-17
  • 2021-10-02
相关资源
最近更新 更多