我一直在尝试使用新的iOS 11拖放功能。它很棒,但只适用于iPad。苹果声称它也适用于iPhone,但我在那里无法使其工作?是苹果的声明错误,还是我做错了什么?
我一直在尝试使用新的iOS 11拖放功能。它很棒,但只适用于iPad。苹果声称它也适用于iPhone,但我在那里无法使其工作?是苹果的声明错误,还是我做错了什么?
你正在给某个视图安装一个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
。
isEnabled = true
,因为我认为它默认为true,在iPhone上没有起作用。 - Ivan Cantarino在Swift 4和iOS 11中,根据您的需求,您可以选择以下其中一种方法来解决问题。
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
}
}
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
}
}
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)
}
/* ... */
}