如何在iPhone上启用iOS 11的拖放功能

9

我一直在尝试使用新的iOS 11拖放功能。它很棒,但只适用于iPad。苹果声称它也适用于iPhone,但我在那里无法使其工作?是苹果的声明错误,还是我做错了什么?


请问这是关于如何在 iPhone 上启用自定义 UIView 的 UIDragInteraction 的问题吗? - Martin R
@MartinR 是的,但是那里没有被接受的答案,并且那个答案没有解释为什么我在让这个工作时遇到了很多麻烦。我的回答有解释。 - matt
2个回答

16

你正在给某个视图安装一个UIDragInteraction对象,对吗?好的,默认情况下,在iPhone上,该拖动交互的isEnabled属性为false(遵循isEnabledByDefault类属性的设备相关值)。

因此,要在iPhone上启用拖放功能,只需在创建时将拖放交互的isEnabled设置为true:

override func viewDidLoad() {
    super.viewDidLoad()

    let dragger = UIDragInteraction(delegate: self)
    self.dragView.addInteraction(dragger)
    dragger.isEnabled = true // for iPhone: presto, we've got drag and drop!
}

同样适用于表格视图或集合视图,如其他答案所指出的,您需要将其 dragInteractionEnabled 设置为 true,因为默认情况下在 iPhone 上它也是 false


2
这非常有帮助。我错过了 isEnabled = true,因为我认为它默认为true,在iPhone上没有起作用。 - Ivan Cantarino
1
@IvanCantarino 是的,这正是问题所在:iPad和iPhone上的默认设置不同。这是苹果一个有趣的设计决策。 - matt
2
什么?!我花了好几个小时才找到它…… :/ 在文档和 WWDC 视频中都没有提到过。在 Playground 中一切正常,但在模拟器/真实设备上却没有任何反应 :D 真是太奇怪了。 - Adam Smaka

10

在Swift 4和iOS 11中,根据您的需求,您可以选择以下其中一种方法来解决问题。


#1. 在iPhone上允许UITableView进行拖放交互

UITableView有一个名为dragInteractionEnabled的属性。 dragInteractionEnabled具有以下声明:

var dragInteractionEnabled: Bool { get set }

一个布尔值,指示表格视图是否支持应用程序之间的拖放操作。

在 iPad 上,此属性的默认值为 true,而在 iPhone 上则为 false。将该值更改为 true 可使 iPhone 上的表视图能够从表视图中拖动内容到另一个应用程序,并接收来自其他应用程序的内容。

以下代码显示如何使用 dragInteractionEnabled 来允许 iPhone 上的 UITableView 进行拖放交互:

class TableViewController: UITableViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        /* ... */

        tableView.dragInteractionEnabled = true
    }

}

#2. 允许在iPhone上使用拖放与UICollectionView交互

UICollectionView有一个名为dragInteractionEnabled的属性。 dragInteractionEnabled具有以下声明

var dragInteractionEnabled: Bool { get set }

一个布尔值,表示集合视图是否支持应用程序之间的拖放。

在 iPad 上,此属性的默认值为 true,在 iPhone 上为 false。将其值更改为 true 可以使 iPhone 上的集合视图能够将内容从集合视图拖动到另一个应用程序中,并接收来自其他应用程序的内容。

以下代码演示如何使用 dragInteractionEnabled 允许 iPhone 上的 UICollectionView 进行拖放交互:

class CollectionViewController: UICollectionViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        /* ... */

        collectionView?.dragInteractionEnabled = true
    }

}

#3. 允许在iPhone上为UIImageView启用拖放交互

UIDragInteraction有一个名为isEnabled的属性。isEnabled具有以下声明

var isEnabled: Bool { get set }

一个布尔值,指定拖动交互是否响应触摸并允许参与拖动活动。

以下代码展示了如何在iPhone上为UIImageView使用isEnabled来允许拖动交互以及放置交互:

class ViewController: UIViewController, UIDragInteractionDelegate, UIDropInteractionDelegate {

    let imageView = UIImageView()

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(imageView)
        imageView.image = UIImage(named: "MyImage")
        imageView.isUserInteractionEnabled = true
        imageView.contentMode = .scaleAspectFit
        imageView.frame = view.bounds
        imageView.autoresizingMask = [.flexibleWidth, .flexibleHeight]

        let dropInteraction = UIDropInteraction(delegate: self)
        imageView.addInteraction(dropInteraction)

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

    /* ... */

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接