Я видел несколько ответов о добавлении GestureRecognzier
в subViews, но моя проблема в том, что у меня заранее нет фрейма subView. Я рисую CGPath
и методом Touches Ended
хочу создать новый subView
с рамкой, равной ограничивающей рамке CGPath
. После этого я хочу перетащить этот subView
с PanGestureRecognizer
. Я пытаюсь реализовать функциональность Evernote crop
, когда пользователь выбирает определенную область просмотра и перемещает ее в другую позицию. Это правильный подход к этому решению?
Создайте подпредставление с помощью CGPath, а затем добавьте UIPanGestureRecognizer в это подпредставление.
Ответы (1)
Не совсем понимаю взаимосвязь между UIGestureRecognizer
и .frame
. вы можете просто добавить UIGestureRecognizer
к объекту после завершения его инициализации. Попробуйте добавить жест в методе 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("???")
}
}
}
person
Chen Wei
schedule
06.02.2017
Как я могу использовать состояния GestureRecognizer, такие как . начался или .cancelled в этом коде. Когда панорама закончилась, я хочу выполнить другое действие. или Коротко Могу ли я проверить, когда панорамирование закончилось в subView. Спасибо
- person HussnainWaris; 06.02.2017
Вы можете использовать свойство
.state
, просмотрите мой код (отредактировано)
- person Chen Wei; 06.02.2017
Если я хочу создать subViewByCGPath и добавить его в другой subView (скажем, DrawingView). Какие изменения вы бы порекомендовали в функции panGestureAction для перевода?
- person HussnainWaris; 07.02.2017
@HussnainWaris В основном жест панорамирования используется для постоянного обновления положения объекта. В этом случае демонстрация уже сделана. Если цель состоит в том, чтобы добавить это подпредставление (созданное CGPath) в другое подпредставление (DrawingView) при вызове функции panGestureAction, вы должны использовать tapGesture и реализовать эту логику при завершении касания.
- person Chen Wei; 07.02.2017
Спасибо за демонстрацию. Мне нужно добавить subViewbyCGPath в другой SubView (DrawingView), а затем добавить PanGesture в subViewByCGPath.
func panGestureAction(rec: UIPanGestureRecognizer){ print("pannnnnnn~") let transPoint = rec.translation(in: TouchDrawing.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: TouchDrawing.view) }
- person HussnainWaris; 07.02.2017