简体   繁体   English

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

[英]Create a subView using CGPath and than adding UIPanGestureRecognizer on that subview

I have seen several answers about adding a GestureRecognzier to subViews but my problem is that I don't have the subView's frame available beforehand. 我已经看到了有关将GestureRecognzier添加到subViews的几个答案,但是我的问题是我没有预先可用的subView框架。 I am drawing a CGPath and at the Touches Ended method, I want to create a new subView with frame equal to CGPath bounding box. 我正在绘制CGPath并在Touches Ended方法中创建了一个等于CGPath边界框的新子subView After that, I want to drag that subView with PanGestureRecognizer . 在那之后,我想拖动subViewPanGestureRecognizer I am trying to implement Evernote crop functionality where the user selects a certain area of view and move it to other position. 我正在尝试实现Evernote crop功能,用户可以在其中选择特定的视图区域并将其移动到其他位置。 Is this the right approach to that solution? 这是该解决方案的正确方法吗?

Not quite understand the relationship between UIGestureRecognizer and .frame . 不太了解UIGestureRecognizer.frame之间的关系。 you can simply add UIGestureRecognizer to object, once its init work finished. 您只需将UIGestureRecognizer添加到对象,即可完成其初始化工作。 Try to add gesture in TouchEnd method directly after drawing subview. 尝试在绘制子视图后直接在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("???")
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM