按下一个按钮,然后能够触摸屏幕并从(起点)拖动一个空心矩形,直到你松开(端点)



使用绘图程序或使用Photoshop时,通常可以从按钮面板中选择一个矩形。在那里,您可以按下按钮,然后可以根据您选择的起点/终点在屏幕上拖动一个矩形。

@IBDesignable class RectView: UIView {
@IBInspectable var startPoint:CGPoint = CGPoint.zero {
didSet{
self.setNeedsDisplay()
}
}
@IBInspectable var endPoint:CGPoint = CGPoint.zero {
didSet{
self.setNeedsDisplay()
}
}
override func draw(_ rect: CGRect) {
if (startPoint != nil && endPoint != nil){
let path:UIBezierPath = UIBezierPath(rect: CGRect(x: min(startPoint.x, endPoint.x),
y: min(startPoint.y, endPoint.y),
width: abs(startPoint.x - endPoint.x),
height: abs(startPoint.y - endPoint.y)))
UIColor.black.setStroke()
path.lineCapStyle = .round
path.lineWidth = 10
path.stroke()
}
}
}

顶视图控制器

+添加了类矩形视图视图(自定义类)

class ViewController: UIViewController, UIGestureRecognizerDelegate {
let rectView = RectView()
@IBOutlet var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let tap = UITapGestureRecognizer(target: self, action: #selector(panGestureMoveAround(sender:)))
tap.delegate = self
myView.addGestureRecognizer(tap)

视图控制器

@objc func panGestureMoveAround(sender: UITapGestureRecognizer) {
var locationOfBeganTap: CGPoint
var locationOfEndTap: CGPoint
if sender.state == UIGestureRecognizer.State.began {
locationOfBeganTap = sender.location(in: rectView)
rectView.startPoint = locationOfBeganTap
rectView.endPoint = locationOfBeganTap
} else if sender.state == UIGestureRecognizer.State.ended {
locationOfEndTap = sender.location(in: rectView)
rectView.endPoint = sender.location(in: rectView)
} else{
rectView.endPoint = sender.location(in: rectView)
}
}

代码没有给出特定的错误,但是屏幕上没有发生任何内容。任何建议都会有所帮助。

但是,您应该尝试一次专注于一个问题...

1)@IBDesignable@IBInspectable用于设计时 - 即在情节提要/界面生成器中布局视图时。这不是您在这里要做的,因此请删除它们。

2) CGrect() 需要 x, t, 宽度和高度:

let path:UIBezierPath = UIBezierPath(rect: CGRect(x: min(startPoint!.x, endPoint!.x),
y: min(startPoint!.y, endPoint!.y),
width: fabs(startPoint!.x - endPoint!.x),
height: fabs(startPoint!.y - endPoint!.y)))

3)实例化视图的错误方式:

// wrong
let rectView = RectView.self
// right
let rectView = RectView()

纠正这些问题,看看你得到哪里。如果仍然遇到问题,请先搜索特定问题。如果您无法通过搜索找到答案,请返回并发布特定问题。

可能值得回顾 如何问