用于以编程方式添加的 UIView 的 UIPanGestureRecognizer
UIPanGestureRecognizer for programmatically added UIView
我想在长时间的压力手势后创建圆圈,并在仍然按下屏幕上的手指的同时使其随着平移手势移动。当手指从屏幕上移开时,应从中移除圆圈。
使用长按手势创建圆圈效果很好,只是它不会移动。代码如下:
@IBAction func spaceLongPressed(_ guesture: UILongPressGestureRecognizer) {
let location = guesture.location(in: space)
var panGesture = UIPanGestureRecognizer()
circleView = UIView(frame: CGRect(x: location.x - space.bounds.height/4, y: location.y - space.bounds.height/4, width: space.bounds.height/2, height: space.bounds.height/2))
if guesture.state == .began {
circleView.backgroundColor = UIColor.red
circleView.isUserInteractionEnabled = true
circleView.tag = 100
circleView.layer.cornerRadius = circleView.bounds.height/2
space.addSubview(circleView)
panGesture = UIPanGestureRecognizer(target: space, action: #selector(didPan(sender:)))
space.addGestureRecognizer(panGesture)
}
if guesture.state == .ended {
if let viewWithTag = self.view.viewWithTag(100) {
viewWithTag.removeFromSuperview()
}
}
}
@objc func didPan(sender: UIPanGestureRecognizer) {
if sender.state == .began {
let translation = sender.translation(in: sender.view)
let changeX = (sender.view?.center.x)! + translation.x
let changeY = (sender.view?.center.y)! + translation.y
sender.view?.center = CGPoint(x: changeX, y: changeY)
sender.setTranslation(CGPoint.zero, in: sender.view)
}
}
对象 "space" 是 UIButton 类型 - 我想在按钮中创建圆圈。
无需创建panGesture 来更新位置。您可以使用长按手势获得相同的效果。 (我对上面的代码做了一点改动,尤其是创建时的视图框架)。
var circleView: UIView!
@IBAction func spaceLongPressed(_ guesture: UILongPressGestureRecognizer) {
let location = guesture.location(in: view)
let size = CGSize(width: 100, height: 100)
circleView = UIView(frame: CGRect(origin: location, size: size))
if guesture.state == .began {
circleView.backgroundColor = UIColor.red
circleView.isUserInteractionEnabled = true
circleView.tag = 100
circleView.layer.cornerRadius = circleView.bounds.height/2
view.addSubview(circleView)
}
if guesture.state == .changed {
let position = guesture.location(in: view)
if let viewWithTag = self.view.viewWithTag(100) {
viewWithTag.center = position
}
}
if guesture.state == .ended {
if let viewWithTag = self.view.viewWithTag(100) {
viewWithTag.removeFromSuperview()
}
}
}
输出:
我想在长时间的压力手势后创建圆圈,并在仍然按下屏幕上的手指的同时使其随着平移手势移动。当手指从屏幕上移开时,应从中移除圆圈。 使用长按手势创建圆圈效果很好,只是它不会移动。代码如下:
@IBAction func spaceLongPressed(_ guesture: UILongPressGestureRecognizer) {
let location = guesture.location(in: space)
var panGesture = UIPanGestureRecognizer()
circleView = UIView(frame: CGRect(x: location.x - space.bounds.height/4, y: location.y - space.bounds.height/4, width: space.bounds.height/2, height: space.bounds.height/2))
if guesture.state == .began {
circleView.backgroundColor = UIColor.red
circleView.isUserInteractionEnabled = true
circleView.tag = 100
circleView.layer.cornerRadius = circleView.bounds.height/2
space.addSubview(circleView)
panGesture = UIPanGestureRecognizer(target: space, action: #selector(didPan(sender:)))
space.addGestureRecognizer(panGesture)
}
if guesture.state == .ended {
if let viewWithTag = self.view.viewWithTag(100) {
viewWithTag.removeFromSuperview()
}
}
}
@objc func didPan(sender: UIPanGestureRecognizer) {
if sender.state == .began {
let translation = sender.translation(in: sender.view)
let changeX = (sender.view?.center.x)! + translation.x
let changeY = (sender.view?.center.y)! + translation.y
sender.view?.center = CGPoint(x: changeX, y: changeY)
sender.setTranslation(CGPoint.zero, in: sender.view)
}
}
对象 "space" 是 UIButton 类型 - 我想在按钮中创建圆圈。
无需创建panGesture 来更新位置。您可以使用长按手势获得相同的效果。 (我对上面的代码做了一点改动,尤其是创建时的视图框架)。
var circleView: UIView!
@IBAction func spaceLongPressed(_ guesture: UILongPressGestureRecognizer) {
let location = guesture.location(in: view)
let size = CGSize(width: 100, height: 100)
circleView = UIView(frame: CGRect(origin: location, size: size))
if guesture.state == .began {
circleView.backgroundColor = UIColor.red
circleView.isUserInteractionEnabled = true
circleView.tag = 100
circleView.layer.cornerRadius = circleView.bounds.height/2
view.addSubview(circleView)
}
if guesture.state == .changed {
let position = guesture.location(in: view)
if let viewWithTag = self.view.viewWithTag(100) {
viewWithTag.center = position
}
}
if guesture.state == .ended {
if let viewWithTag = self.view.viewWithTag(100) {
viewWithTag.removeFromSuperview()
}
}
}