如何拖动图像
问题描述:
我可以使用下面的代码移动单个UIView
,但我怎么移动多个UIView
的单独使用IBOutletCollection
和tag
值?如何拖动图像
class TeamSelection: UIViewController {
var location = CGPoint(x: 0, y: 0)
@IBOutlet weak var ViewTest: UIView! // move a single image
@IBOutlet var Player: [UIView]! // collection to enable different images with only one outlet
override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
let touch: UITouch = touches.first! as UITouch
location = touch.location(in: self.view)
ViewTest.center = location
}
}
答
有两种基本方法:
你可以遍历您的子视图找出其中一个触摸相交和移动。但是这种方法(也不使用隐含的数值来标识视图)通常不是首选的方法。
-
个人而言,我把拖逻辑的子视图本身:
class CustomView: UIView { // or subclass `UIImageView`, as needed private var originalCenter: CGPoint? private var dragStart: CGPoint? override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { originalCenter = center dragStart = touches.first!.location(in: superview) } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } var location = touch.location(in: superview) if let predicted = event?.predictedTouches(for: touch)?.last { location = predicted.location(in: superview) } center = dragStart! + location - originalCenter! } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { guard let touch = touches.first else { return } let location = touch.location(in: superview) center = dragStart! + location - originalCenter! } } extension CGPoint { static func +(lhs: CGPoint, rhs: CGPoint) -> CGPoint { return CGPoint(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } static func -(lhs: CGPoint, rhs: CGPoint) -> CGPoint { return CGPoint(x: lhs.x - rhs.x, y: lhs.y - rhs.y) } }
记得设置为子视图,如果你使用这种方法,“启用用户交互”。顺便说一下,如果您要拖动这样的视图,请确保您没有对这些视图的限制,否则当自动布局引擎接下来应用自身时,所有内容都将移回原始位置。如果使用自动布局,通常会修改约束的
constant
。
一对夫妇上拖动逻辑观察:
您可能需要使用触摸预测,像上面,以降低风阻的11:43。
而不是移动
center
到触摸的location(in:)
,我宁愿用我多少拖着它,要么相应地移动center
或应用相应的翻译防不胜防。这是一个更好的UX,恕我直言,因为如果你抢的角落,它可以让你在角落里拖,而不是它跳的观点在触控是在屏幕的中央。
答
我想创建一个支持拖动的UIView的子类。喜欢的东西:
class DraggableView: UIView {
func setDragGesture() {
let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(DraggableView.handlePanGesture(_:)))
addGestureRecognizer(panRecognizer)
}
func handlePanGesture(_ recognizer: UIPanGestureRecognizer) {
guard let parentView = self.superview else { return }
let translation = recognizer.translation(in: parentView)
recognizer.view?.center = CGPoint(x: recognizer.view!.center.x + translation.x, y: recognizer.view!.center.y + translation.y)
recognizer.setTranslation(CGPoint.zero, in: self)
}
func getLocation() -> CGPoint {
return UIView().convert(center, to: self.superview)
}
}
,那么你可以添加可拖动的意见数组,然后询问位置,当您需要结束显示该视图控制器。
谢谢,我将如何使用@IBOutlet var Player:[UIView]!在移动图像的功能内 – Chet
@Chet - 你有插座的事实是无关紧要的。问题是你如何实例化这些视图。例如,如果在IB中,请确保将这些玩家视图的基类指定为上面显示的自定义类。但是,所有的'@ IBOutlet'东西是不变的 – Rob
我忘了子类分配给imagueView – Chet