[英]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
. 在那之后,我想拖动subView
与PanGestureRecognizer
。 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.