在整个屏幕上触摸拖动视图

Posted

技术标签:

【中文标题】在整个屏幕上触摸拖动视图【英文标题】:Touch drag a View all over the screen 【发布时间】:2016-01-24 08:14:18 【问题描述】:

我有一个 UIImageView 与框架 (0,0,320,200) 一起放置。

我已经使用简单的手势向它添加了触摸拖动。

- (void)touchesMoved:(NSSet *)set withEvent:(UIEvent *)event 
    CGPoint p = [[set anyObject] locationInView:self.superview];
    self.center = p;

它工作正常,但是一旦我将它拖到屏幕底部,假设并移开我的手指然后尝试触摸它,它就会停止检测视图上的触摸并开始检测屏幕上视图上的触摸。现在这个 imageView 被放置在所有视图之上,所以我什至不确定它为什么没有被触摸,

现在,如果以某种方式使用任何按钮使其移动到原来的位置,它就会再次开始检测触摸。

那么这里发生了什么?

【问题讨论】:

【参考方案1】:

例如,在您的 viewDidLoad 方法中设置 gestureRecognizer

UIPanGestureRecognizer *panRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(wasDragged:)];

[YourImageView addGestureRecognizer:panRecognizer];

一旦您的 ImageView 被移动,gestureRecognizer 对象将触发您创建的目标方法wasDragged:,您可以从这里更新视图的位置。

- (void)wasDragged:(UIPanGestureRecognizer *)recognizer 

     UIImagewView *imageView = (UIImagewView *)recognizer.view;
     CGPoint translation = [recognizer translationInView:imageView];

     imageView.center = CGPointMake(imageView.center.x + translation.x, imageView.center.y + translation.y);
     [recognizer setTranslation:CGPointZero inView:imageView];

按照您所说的将它拖到屏幕底部后,您应该可以将其从上次离开的位置再次拖到。

我希望这会有所帮助。

【讨论】:

为什么在 UIImageView 的中心移到 UIView 之外后,它会忽略触摸? 无论如何,您都可以忽略默认值是 YES。我已经编辑了答案以将其删除,因为您无需在此处进行设置。我使用它是因为我有一个特定的设置,我在移动时更改图像。

以上是关于在整个屏幕上触摸拖动视图的主要内容,如果未能解决你的问题,请参考以下文章

如何通过触摸在屏幕上拖动手指来移动 3D 对象

仅在触摸图像时拖动图像

调度触摸事件到画布上绘制的视图

讲解iOS开发中拖动视图的实现

Flutter 在整个屏幕上禁用触摸

多个uiimageview触摸