使用 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 使用其识别器进行反弹?