使用 pangesturerecognizer 创建边界以阻止对象进入状态栏下方?

Posted

技术标签:

【中文标题】使用 pangesturerecognizer 创建边界以阻止对象进入状态栏下方?【英文标题】:Create a boundary to stop objects going under the Status Bar with pangesturerecognizer? 【发布时间】:2014-01-24 03:12:17 【问题描述】:

我正在使用 pangesturerecognizer 在屏幕上移动对象。

如何为对象创建一个边界以不超过屏幕顶部的某个点? 我正在考虑使用这个imageView.frame.origin.y > 0,但真的不确定如何将它添加到这段代码中。 状态栏显然覆盖了屏幕顶部的 44 像素,我可能希望这样做以在屏幕底部创建 44 的边界。

我正在使用此代码:

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


@SomeGuy 好的,我尝试使用:

recognizer.view.center = CGPointMake(MIN(recognizer.view.superview.frame.size.width - recognizer.view.frame.size.width / 2, MAX(-recognizer.view.frame.size.width / 2, recognizer.view.center.x + translation.x)),
                                             MIN(recognizer.view.superview.frame.size.height - recognizer.view.frame.size.height / 2, MAX(-recognizer.view.frame.size.height / 2, recognizer.view.center.y + translation.y)));

但我想不出让它停止进入酒吧的逻辑。我确实通过这样做让它停止了。

编辑 此代码阻止它进入顶部栏,但我不确定如何创建边框或阻止它进入下方。

if (recognizer.view.center.y < 44) 


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

【问题讨论】:

不知道为什么这是-1,如果你要拿掉分数,你能告诉我们为什么这样我可以从中学习。 我还是不明白我为什么得到-1? 【参考方案1】:

其实很简单,看这张图:

为了防止您的视图超出超级视图,您必须确保视图的中心永远不会在红色区域中获得值。为此,您可以使用这样的代码:

float minX = recognizer.view.frame.size.width /2;
float maxX = recognizer.view.superview.frame.size.width - minX;
float minY = recognizer.view.frame.size.height /2;
float maxY = recognizer.view.superview.frame.size.height - minY;
recognizer.view.center = CGPointMake(MIN(MAX(minX,recognizer.view.center.x + translation.x),maxX),MIN(MAX(minY,recognizer.view.center.y + translation.y),maxY));

【讨论】:

谢谢你,我通过将我需要的量添加到 minX 和 minY 浮点数来保持自定义距离。浮动 minX = 识别器.view.frame.size.width /2 + 44;浮动 minY = 识别器.view.frame.size.height /2 + 44; 添加自定义边框值是否正确? 有没有一本好书解释了你从中学到的手势框架?我仍在试图理解您为什么将框架分为 2 识别器视图的大小是多少? iPhone 3/4 为 320 x 480。【参考方案2】:

类似的东西

recognizer.view.center = CGPointMake(MIN(recognizer.view.superview.frame.size.width - recognizer.view.frame.size.width / 2, MAX(-recognizer.view.frame.size.width / 2, recognizer.view.center.x + translation.x)),
                                             MIN(recognizer.view.superview.frame.size.height - recognizer.view.frame.size.height / 2, MAX(-recognizer.view.frame.size.height / 2, recognizer.view.center.y + translation.y)));

这不会让它超出超级视图的范围,您需要为任何条添加逻辑

【讨论】:

对象没有离开屏幕。尽管我想创建一个可以在其中移动的边界或区域,但它们在 0 处停止。

以上是关于使用 pangesturerecognizer 创建边界以阻止对象进入状态栏下方?的主要内容,如果未能解决你的问题,请参考以下文章

PanGestureRecognizer 在拖动过程中零星出现

使用 PanGestureRecognizer 创建 UIView 并在不抬起手指的情况下激活它

如何通过 panGestureRecognizer 启用 collectionView 分页

Swift - 带有英雄动画的 PanGestureRecognizer

对于 UIScrollview,我如何使用自己的 panGestureRecognizer 但允许 scrollView 使用其识别器进行反弹?

PanGestureRecognizer 的有限区域