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

Ios 使用CGPath创建子视图,然后在该子视图上添加UIPangestureRecognitor,ios,swift3,subview,uipangesturerecognizer,evernote,Ios,Swift3,Subview,Uipangesturerecognizer,Evernote,关于向子视图添加gesturererecognzier,我已经看到了一些答案,但我的问题是我事先没有子视图的框架可用。我正在绘制一个CGPath,在方法中,我想创建一个新的子视图,框架等于CGPath边界框。在那之后,我想用pangestrerecognizer拖动子视图。我正在尝试实现evernotecrop功能,用户可以选择某个视图区域并将其移动到其他位置。这是解决问题的正确方法吗 不太了解UIgestureRecognitor和.frame之间的关系。一旦对象的初始化工作完成,您只需将ui

关于向子视图添加
gesturererecognzier
,我已经看到了一些答案,但我的问题是我事先没有子视图的框架可用。我正在绘制一个
CGPath
,在
方法中,我想创建一个新的
子视图
,框架等于
CGPath
边界框。在那之后,我想用
pangestrerecognizer
拖动
子视图。我正在尝试实现
evernotecrop
功能,用户可以选择某个视图区域并将其移动到其他位置。这是解决问题的正确方法吗

不太了解
UIgestureRecognitor
.frame
之间的关系。一旦对象的初始化工作完成,您只需将
uigesturecognizer
添加到该对象。 尝试在绘制子视图后直接在
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("???")
        }
    }
}
导入UIKit
类手势研究VC:UIViewController{
var subViewByCGPath:UIView?
重写func viewDidLoad(){
super.viewDidLoad()
}
func createSubView(){
//创建子视图
子视图BYCGPATH=UIView(帧:CGRect(x:100,y:100,宽度:100,高度:100))
subViewByCGPath?.backgroundColor=UIColor.yellow
设circlePath=UIBezierPath(弧心:CGPoint(x:50,y:50),半径:CGFloat(20),星形缠结:CGFloat(0),端角:CGFloat(M_PI*2),顺时针:true)
设shapeLayer=CAShapeLayer()
shapeLayer.path=circlePath.cgPath
shapeLayer.strokeColor=UIColor.red.cgColor
subViewByCGPath?.layer.addSublayer(shapeLayer)
self.view.addSubview(subViewByCGPath!)
//将平移手势添加到子视图BYCGPATH
让手势=UIPangestureRecognitor(目标:自我,动作:#选择器(panGestureAction(rec:))
子视图BYCGPATH?.AddGestureRecognitor(手势)
}
覆盖函数touchesend(touchs:Set,带有事件:UIEvent?){
如果subViewByCGPath==nil{
打印(“触摸结束一次”)
createSubView()
}否则{
打印(“反复触摸结束”)
}
}
func panGestureAction(记录:UIPangestureRecognitor){
打印(“pannnnnnn~”)
让transpint=rec.translation(在:self.view中)
设x=rec.view!.center.x+transpint.x
设y=rec.view!.center.y+transpint.y
rec.view!.center=CGPoint(x:x,y:y)
rec.setTranslation(CGPoint(x:0,y:0),in:self.view)
//区分状态
开关记录状态{
案例.开始:
打印(“开始”)
案例。更改:
打印(“更改”)
案件结束:
打印(“结束”)
违约:
打印(“?”)
}
}
}

如何使用手势识别器状态,例如。在此代码中已开始或已取消。当锅结束时,我想执行另一个动作。或者,我可以很快检查平移在子视图上何时结束。感谢您可以使用
.state
属性,如果我想通过cgpath创建子视图并将其添加到另一个子视图(比如DrawingView),请浏览我的代码(已编辑)。那么,对于平移,您建议对panGestureAction函数进行哪些更改?@HussnainWaris主要使用平移手势来不断更新对象位置。在本例中,演示已经完成。如果目标是在调用panGestureAction函数时将该子视图(由CGPath创建)添加到另一个子视图(DrawingView),则应使用Tap手势并在触摸结束时实现该逻辑。感谢演示。我需要将subViewbyCGPath添加到另一个子视图(DrawingView),然后在subViewbyCGPath上添加PanGesture<代码>func panGestureAction(rec:uiPangestureRecognitor){print(“pannnnnnn~”)let transpint=rec.translation(in:TouchDrawing.view)let x=rec.view!.center.x+transpint.x let y=rec.view!.center.y+transpint.y rec.view!。center=CGPoint(x:x,y:y)rec setTranslation(CGPoint(x:0,y:0),在:TouchDrawing.view)中}