如何让 iOS 11 拖放在 iPhone 上运行

Posted

技术标签:

【中文标题】如何让 iOS 11 拖放在 iPhone 上运行【英文标题】:How to get iOS 11 drag and drop working on the iPhone 【发布时间】:2018-03-05 15:57:19 【问题描述】:

我一直在尝试新的 ios 11 拖放功能。这很棒,但它只能在 iPad 上运行。 Apple声称它也适用于iPhone,但我无法让它在那里工作?苹果的说法是假的,还是我做错了什么?

【问题讨论】:

***.com/questions/45225329/… 的副本? @MartinR 是的,但没有接受任何答案,而且答案没有解释为什么我在让它工作时遇到了很多麻烦。我的回答是。 【参考方案1】:

您正在某些视图上安装 UIDragInteraction 对象,对吗?好吧,默认情况下,拖拽交互的isEnabled 属性在iPhone 上是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

【讨论】:

这很有帮助。我错过了isEnabled = true,因为我认为默认情况下它是正确的,并且它不适用于 iPhone。 @IvanCantarino 是的,这正是棘手的问题:iPad 和 iPhone 的默认设置不同。 Apple 的一个有趣的设计决定。 哇?!我花了几个小时才找到它......:/在文档和 WWDC 视频中的任何地方都没有提到它。在操场上一切都很好,在模拟器/真实设备上什么都没有:D 所以weeeeird【参考方案2】:

使用 Swift 4 和 iOS 11,根据您的需要,您可以选择以下方法之一来解决您的问题。


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

UITableView 有一个名为dragInteractionEnabled 的属性。 dragInteractionEnabled 有以下declaration:

var dragInteractionEnabled: Bool  get set 

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

此属性的默认值为 iPad 上的 true 和 iPhone 上的 false。在 iPhone 上将值更改为 true 可以将内容从 table view 拖动到 iPhone 上的另一个应用程序并接收来自其他应用程序的内容。

以下代码显示了如何使用dragInteractionEnabled 以允许在iPhone 上与UItableView 进行拖放交互:

class TableViewController: UITableViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        /* ... */

        tableView.dragInteractionEnabled = true
    



#2。允许在 iPhone 上对UICollectionView 进行拖放交互

UICollectionView 有一个名为dragInteractionEnabled 的属性。 dragInteractionEnabled 有以下declaration:

var dragInteractionEnabled: Bool  get set 

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

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

以下代码显示了如何使用dragInteractionEnabled 以允许在iPhone 上与UICollectionView 进行拖放交互:

class CollectionViewController: UICollectionViewController 

    override func viewDidLoad() 
        super.viewDidLoad()

        /* ... */

        collectionView?.dragInteractionEnabled = true
    



#3。允许在 iPhone 上对UIImageView 进行拖放交互

UIDragInteraction 有一个名为isEnabled 的属性。 isEnabled 有以下declaration:

var isEnabled: Bool  get set 

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

以下代码显示了如何使用isEnabled,以便在iPhone 上允许UIImageView 的拖放交互和拖放交互:

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)
    

    /* ... */


【讨论】:

以上是关于如何让 iOS 11 拖放在 iPhone 上运行的主要内容,如果未能解决你的问题,请参考以下文章

苹果实用技巧-777期:如何能让旧款iPhone运行iOS11系统更流畅?

如何让我的应用在 iPhone 上后台运行?

如何在 iOS 11 的 UITextfield 中启用拖动

iPad升级到iOS11可在屏幕上同时运行4个应用程序,你知道怎么做吗?

iPhone/iOS:如何为 Scrollview 的子视图实现拖放?

在表视图/集合视图中采用拖放在 iPhone 上不起作用