使用CGPath创建子视图,然后在该子视图上添加UIPanGestureRecognizer

时间:2017-02-06 01:36:14

标签: ios swift3 subview uipangesturerecognizer evernote

我已经看到了几个关于向子视图添加GestureRecognzier的答案,但我的问题是我没有预先提供subView的框架。我正在绘制CGPath,并且在Touches Ended方法中,我想创建一个新的subView,其框架等于CGPath边界框。之后,我想将subViewPanGestureRecognizer拖动。我正在尝试实现Evernote crop功能,用户选择某个视图区域并将其移动到其他位置。这是解决方案的正确方法吗?

1 个答案:

答案 0 :(得分:0)

不太了解UIGestureRecognizer.frame之间的关系。一旦init工作完成,你就可以简单地将UIGestureRecognizer添加到object。 在绘制子视图后,尝试直接在TouchEnd方法中添加手势。

import UIKit

class GestureResearchVC: UIViewController{

    var subViewByCGPath: UIView?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    func createSubView(){
        //creat subview
        subViewByCGPath = UIView(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        subViewByCGPath?.backgroundColor = UIColor.yellow
        let circlePath = UIBezierPath(arcCenter: CGPoint(x: 50,y: 50), radius: CGFloat(20), startAngle: CGFloat(0), endAngle:CGFloat(M_PI * 2), clockwise: true)

        let shapeLayer = CAShapeLayer()
        shapeLayer.path = circlePath.cgPath
        shapeLayer.strokeColor = UIColor.red.cgColor

        subViewByCGPath?.layer.addSublayer(shapeLayer)
        self.view.addSubview(subViewByCGPath!)

        //add pan gesture to subViewByCGPath
        let gesture = UIPanGestureRecognizer(target: self, action: #selector(panGestureAction(rec:)))
        subViewByCGPath?.addGestureRecognizer(gesture)
}

    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        if subViewByCGPath == nil {
            print("touch end once")
            createSubView()
        }else{
            print("touch end repeatedly")
        }
    }

    func panGestureAction(rec: UIPanGestureRecognizer){
        print("pannnnnnn~")
        let transPoint = rec.translation(in: self.view)
        let x = rec.view!.center.x + transPoint.x
        let y = rec.view!.center.y + transPoint.y

        rec.view!.center = CGPoint(x: x, y: y)
        rec.setTranslation(CGPoint(x: 0, y: 0), in: self.view)

        //distinguish state
        switch rec.state {
            case .began:
                print("began")
            case .changed:
                print("changed")
            case .ended:
                print("ended")
            default:
                print("???")
        }
    }
}