拖动时显示 UIImageView 对象(使用 UILongPressGestureRecognizer)

Posted

技术标签:

【中文标题】拖动时显示 UIImageView 对象(使用 UILongPressGestureRecognizer)【英文标题】:Getting a UIImageView object to show up when dragging (with UILongPressGestureRecognizer) 【发布时间】:2014-02-16 22:15:54 【问题描述】:

所以我正在尝试使用使用 ALAssets 框架获取的图像缩略图来实现拖放。

我能够让长按手势正常工作(根据一些 NSLog 测试,它肯定会移动某些东西)但我一生都无法弄清楚如何实际显示缩略图图像并拖动它在主视图中。请注意,_dNewImageView 是作为属性添加到视图控制器的 IBOutlet。我正在尝试使用 BringSubviewToFront 将视图置于最前面:但是它没有按预期工作。任何帮助将不胜感激!

这是处理长按手势的函数:

-(void)longGestureRecognized:(UILongPressGestureRecognizer *)gestureRecognizer
    gestureRecognizer.delaysTouchesBegan = YES;
    CGPoint newPoint = [gestureRecognizer locationInView:self.collectionView];

    switch (gestureRecognizer.state) 
        case UIGestureRecognizerStateBegan:
            dIndexPath = [self.collectionView indexPathForItemAtPoint:newPoint];
            if (dIndexPath == nil)
                NSLog(@"Couldn't find index path");
            
            dCell = (SKPhotoCell *)[self.collectionView cellForItemAtIndexPath:dIndexPath];
            dImage = [UIImage imageWithCGImage:[dCell.asset thumbnail]];
            _dNewImageView = [[UIImageView alloc] initWithImage:dImage];
            [_dNewImageView setUserInteractionEnabled:YES];
            [[self view] bringSubviewToFront:_dNewImageView];
            break;

        case UIGestureRecognizerStateChanged:
            [_dNewImageView setCenter:newPoint];
            break;

        case UIGestureRecognizerStateEnded:
            break;
    

【问题讨论】:

【参考方案1】:

需要补充两点:

[self.view insertSubview:_dNewImageView aboveSubview:self.collectionView]; 分配和初始化_dNewImageView

[gestureRecognizer setTranslation:CGPointZero inView:gestureRecognizer.view]; 在您的手势识别方法中。

如果您按照代码建议重用_dNewImageView,则不应在每次调用该方法时分配和初始化它。使用[_dNewImageView setImage:dImage];

此外,当您检查indexPath 是否存在时,请务必为该方法实现某种方式来返回或绕过图像内容。

例如:

- (void) someOtherMethod 
    _dNewImageView = [[UIImageView alloc] init];
    _dNewImageView.frame = CGRectSomething;
    _dNewImageView.userInteractionEnabled = YES;
    [self.view insertSubview:_dNewImageView aboveSubview:self.collectionView];


- (void) longGestureRecognized:(UILongPressGestureRecognizer *)gestureRecognizer 
    ...
        case UIGestureRecognizerStateBegan:
            ...
            if (dIndexPath == nil) 
                NSLog(...);
                return; /*or*/ goto noIndexPath;
            
            ...
        break;

    //if used 'goto'
    noIndexPath:
        [gestureRecognizer setTranslation:CGPointZero inView:gestureRecognizer.view];

    ...

【讨论】:

感谢您的帮助!一切正常,除了 [gestureRecognizer setTranslation:CGPointZero inView:gestureRecognizer.view];这给出了错误读数:“UILongPressGestureRecognizer”没有可见的@interface声明选择器“setTranslation:inView:”我尝试将UILongPressGestureRecognizer添加为委托,但这是无效的。 确保您的@interface 包含 抱歉给您带来了困惑,这个错误到底是什么意思? setTranslation:inView: 加法是我的错,我错误地认为使用 UIPanGestureRecognizer 代替了 UILongPressGestureRecognizer。前者有 -[UIPanGestureRecognizer setTranslation:inView:] 而后者没有。

以上是关于拖动时显示 UIImageView 对象(使用 UILongPressGestureRecognizer)的主要内容,如果未能解决你的问题,请参考以下文章

面料JS |滚动或拖动任何对象时显示不需要的线条

如何在PyQt5中使用QDrag拖动时显示QPushButton?

选择表格视图单元格时显示自定义 UIImageView

Qt - 如何在拖动项目时显示图像/图标/数据?

使 UIImageView 透明并在触摸时显示其下方的 UIImageView

Xcode 9 在 Ctrl+拖动时显示菜单