【问题标题】:Ability to shorten UIDragInteraction's long press timing能够缩短 UIDragInteraction 的长按时间
【发布时间】:2018-06-18 22:18:55
【问题描述】:

我目前正在使用 iOS 11 中提供的 UIDragInteractionUIDropInteraction 来实现简单的拖放功能,用户可以将 UIImageView 拖到 UIView 上。

我意识到其中一个不直观的因素是UIDragInteraction 需要至少长按一秒钟才能工作。我想知道是否有办法缩短长按时间?docs on Apple 似乎没有突出这一点。

谢谢!

下面粘贴的实现供参考:

class ViewController: UIViewController {

    @IBOutlet var imageView: UIImageView!
    @IBOutlet var dropArea: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let dragInteraction = UIDragInteraction(delegate: self)
        imageView.addInteraction(dragInteraction)
        dragInteraction.isEnabled = true
        let dropInteraction = UIDropInteraction(delegate: self)
        dropArea.addInteraction(dropInteraction)
    }
}

extension ViewController: UIDragInteractionDelegate {
    func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] {
        guard let image = imageView.image
            else { return [] }

        let itemProvider = NSItemProvider(object: image)
        return [UIDragItem(itemProvider: itemProvider)]
    }
}

extension ViewController: UIDropInteractionDelegate {
    func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
        return UIDropProposal(operation: .copy)
    }

    func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
        guard let itemProvider = session.items.first?.itemProvider,
            itemProvider.canLoadObject(ofClass: UIImage.self)
            else { return }

        itemProvider.loadObject(ofClass: UIImage.self) { [weak self] loadedItem, error in
            guard let image = loadedItem as? UIImage
                else { return }

            DispatchQueue.main.async {
                self?.dropArea.image = image
            }
        }
    }
}

【问题讨论】:

    标签: ios swift drag-and-drop uidragitem


    【解决方案1】:

    没有明显的方法可以做到这一点,但我只是面临同样的问题,并查看了 dragInteraction 附加到的视图的手势识别器。它是 _UIDragLiftGestureRecognizer,它不是公共 API 的一部分,但事实证明这只是 UILongPressGestureRecognizer 的子类。

    因此,在将您的 UIDragInteraction 添加到您的视图之后,并且将该视图添加到视图层次结构之后(因为我使用的是自定义 UIView 子类,所以我刚刚将其添加到 didMoveToSuperview() 中),您可以做一些事情像这样:

    if let longPressRecognizer = gestureRecognizers?.compactMap({ $0 as? UILongPressGestureRecognizer}).first {
        longPressRecognizer.minimumPressDuration = 0.1 // your custom value
    }
    

    【讨论】:

    • 这个技巧似乎适用于不同集合视图之间的常见拖放案例;但是,当使用拖放 API 在同一个集合视图中重新排序时,它可能会导致 UIKit 崩溃。明智地使用。
    【解决方案2】:

    我试图从 Xamarin.iOS 中的 UIView 实现 IUIDragInteractionDelegate 接口。在它的构造函数中,我创建了一个SetupDragNDrop 方法,该方法允许在没有默认延迟/延迟的情况下拖动视图来捕获视图。我把代码留在下面,以防它对其他人有用:

        #region Private Fields
        private UIDragInteraction _UIDragInteraction;
        #endregion
    
        void Initialize()
        {
            SetupDragNDrop();
        }
    
        private void SetupDragNDrop()
        {
            UserInteractionEnabled = true;
            _UIDragInteraction = new UIDragInteraction(this);
            AddInteraction(_UIDragInteraction);
    
            // On iPad, this defaults to true. On iPhone, this defaults to 
            // false. Since this app should work on the iPhone, enable the the 
            // drag interaction.
            _UIDragInteraction.Enabled = true;
    
            SetupDragDelay();
        }
    
        private void SetupDragDelay()
        {
    
            UILongPressGestureRecognizer longPressGesture = new UILongPressGestureRecognizer();
    
            GestureRecognizers?.ToList().ForEach(gesture =>
            {
                var x = gesture as UILongPressGestureRecognizer;
                if (x != null)
                {
                    longPressGesture = x;
                }
            });
    
            longPressGesture.MinimumPressDuration = 0.0;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-01-11
      • 2023-03-28
      • 2012-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多