如何仅对顶级子视图检测并应用平移手势

时间:2017-11-10 05:02:03

标签: ios swift uiview uigesturerecognizer uipangesturerecognizer

我有一个未知数量的子视图,可以显示在名为mainCanvasView的主视图上。我的目标是,当用户在子视图上进行平移手势时

  1. 检测它是哪个子视图,并将该子视图置于mainCanvasView
  2. 之上
  3. 将平移动画转换应用于该子视图
  4. 现在,我已经完成了以下工作:

    //Added a pan gesture hanlder to mainCanvasView
    let panGesture = UIPanGestureRecognizer(target: self, action:#selector(self.handlePanGesture(gesture:)))
    self.mainCanvasView.addGestureRecognizer(panGesture)
    
    //Define the method for handling gestures
    func handlePanGesture(gesture: UIPanGestureRecognizer) {
        if gesture.state == UIGestureRecognizerState.began || gesture.state == UIGestureRecognizerState.changed {
            var appliedView = UIView(frame: view.frame)
            viewLooper: for view in self.mainCanvasView.subviews {
                let point = gesture.location(in: view)
                if (view.hitTest(point, with: nil) != nil) { //Find the view that the finger interacted with
                    appliedView = view
                    break viewLooper
                }
            }
    
            self.mainCanvasView.bringSubview(toFront: appliedView)
            let translation = gesture.translation(in: view)
            appliedView.transform = (appliedView.transform).translatedBy(x: translation.x, y: translation.y)
            gesture.setTranslation(CGPoint(x: 0, y: 0), in: appliedView)
        }
    }
    

    正如gif所示,在移动单个子视图时很好,当子视图略微相互重叠时,会产生奇怪的效果,其中两个子视图都会被移动。

    非常感谢有关如何解决此问题的任何建议。

    enter image description here

2 个答案:

答案 0 :(得分:1)

删除平移手势这是更好的解决方案(您可以在此处添加自己的改进)

我使用过preg_match( '/^\s*(create|alter|truncate|drop)\s/i', $query ) ) { $return_val = $this->result; 种方法

touch

override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { for view in self.viewMain.subviews { if let point = touches.first?.location(in: self.view) { if let viewTouched = self.view.hitTest(point, with: event),viewTouched == view { viewNew = view viewNew.center = point self.viewMain.bringSubview(toFront: view) print("Tapped") break } else { print("Not Tapped") } } } } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if let point = touches.first?.location(in: self.viewMain) { viewNew.center = point } } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { viewNew = UIView() } 是全局viewNew对象

希望它对你有所帮助

答案 1 :(得分:0)

检查以下项目,它可以获得所需的输出

used - 在图像上捏合并点按手势并在屏幕上移动图像

Link - https://github.com/RockinGarg/Moving-views-.git

触摸处理图像

import UIKit

class objectClass: UIImageView, UIGestureRecognizerDelegate {

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
                let touch: UITouch = touches.first!
        self.center = touch.location(in: self.superview)

    }

}

其他手势功能

//recognizing gestures
func recognizePinchGesture(sender: UIPinchGestureRecognizer) {
    sender.view!.transform = sender.view!.transform.scaledBy(x: sender.scale, y: sender.scale)
    sender.scale = 1
}

func recognizeRotateGesture(sender: UIRotationGestureRecognizer) {
    sender.view!.transform = sender.view!.transform.rotated(by: sender.rotation)
    sender.rotation = 0
}