Нарисуйте прямоугольник в качестве отправной точки и следуйте за моим движением, чтобы закончить жест в Swift.

Я задал вопрос в stackoverflow и получил отличный ответ на свой вопрос.

Чтобы получить начальную и конечную точки UIPanGestureRecognizer, используйте код:

var view = UIView()

func panGestureMoveAround(gesture: UIPanGestureRecognizer) {

    var locationOfBeganTap: CGPoint

    var locationOfEndTap: CGPoint

    if gesture.state == UIGestureRecognizerState.Began {
        locationOfBeganTap = gesture.locationInView(view)
    } else if gesture.state == UIGestureRecognizerState.Ended {
        locationOfEndTap = gesture.locationInView(view)
    }
}

А для лучшего обзора я бы нарисовал прямоугольник, который уловил начальную точку и автоматически изменил размер, чтобы завершить движение.

Как мне нарисовать прямоугольник в качестве начальной точки и следовать моему движению, чтобы закончить жест?


person James    schedule 03.12.2015    source источник


Ответы (1)


Вам нужно создать подкласс UIView, назовите его чем-то вроде RectView и вот так:

@IBDesignable
class RectView: UIView {
    @IBInspectable var startPoint:CGPoint?{
        didSet{
            self.setNeedsDisplay()
        }
    }

    @IBInspectable var endPoint:CGPoint?{
        didSet{
            self.setNeedsDisplay()
        }
    }

    override func drawRect(rect: CGRect) {
        if (startPoint != nil && endPoint != nil){
            let path:UIBezierPath = UIBezierPath(rect: CGRectMake(min(startPoint!.x, endPoint!.x),
            min(startPoint!.y, endPoint!.y),
            fabs(startPoint!.x - endPoint!.x),
            fabs(startPoint!.y - endPoint!.y)))
        path.stroke()
    }
    }

}

Затем в вашем контроллере представления вы можете сказать что-то вроде:

@IBAction func panGestureMoveAround(sender: UIPanGestureRecognizer) {
        var locationOfBeganTap: CGPoint

        var locationOfEndTap: CGPoint

        if sender.state == UIGestureRecognizerState.Began {
            locationOfBeganTap = sender.locationInView(rectView)
            rectView.startPoint = locationOfBeganTap
            rectView.endPoint = locationOfBeganTap

        } else if sender.state == UIGestureRecognizerState.Ended {
            locationOfEndTap = sender.locationInView(rectView)
                        rectView.endPoint = sender.locationInView(rectView)
        } else{
            rectView.endPoint = sender.locationInView(rectView)
        }
    }

Версия Swift 5

class RectView: UIView {
    var startPoint: CGPoint? {
        didSet {
            setNeedsDisplay()
        }
    }

    var endPoint: CGPoint? {
        didSet {
            setNeedsDisplay()
        }
    }

    override func draw(_ rect: CGRect) {
        guard let startPoint = startPoint, let endPoint = endPoint else {
            return
        }

        let path = 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)
            )
        )
        path.stroke()
    }
}
@objc func panGestureMoveAround(_ sender: UIPanGestureRecognizer) {
    var locationOfBeganTap: CGPoint

    switch sender.state {
    case .began:
        locationOfBeganTap = sender.location(in: rectView)
        rectView.startPoint = locationOfBeganTap
        rectView.endPoint = locationOfBeganTap
    case .changed:
        rectView.endPoint = sender.location(in: rectView)
    case .ended:
        rectView.endPoint = sender.location(in: rectView)
    default:
        break
    }
}
person beyowulf    schedule 03.12.2015