【问题标题】:How to: bring view to front on tap; set max/min pinch gesture scale; set screen limit to pan gesture如何:点击即可将视图置于前面;设置最大/最小捏手势比例;将屏幕限制设置为平移手势
【发布时间】:2019-07-12 03:35:05
【问题描述】:

注意:我发现的所有东西都太旧或与我实际需要的太不同了,而且我尝试了几乎所有我发现的东西,但没有一种方法能正常工作。

我创建了 3 个 UIView,我可以拖动它们并缩放它们。 现在,我需要:

  1. 将其中一些放在前面:我想为每个添加一个 UITapGesture 允许我将点击的 UIView 带到前面 将其他 UIView 传递到后面;
  2. 为 UIPinchGestureRecognizer 设置最大/最小比例,以便我 不能有超大 UIiews 或小 UIViews;
  3. 为 UIPanGestureRecognizer 设置一种屏幕限制,以便我 无法将我的 UIViews 拖到主视图之外。

这是我的代码:

https://github.com/marybnq/Views

【问题讨论】:

    标签: view swift4 uigesturerecognizer


    【解决方案1】:

    我的问题解决了!

    1. 我想出了如何为 UIPinchGestureRecognizer 设置最大/最小比例,这就是我所做的。
        var recognizerScale:CGFloat = 1.0
        var maxScale:CGFloat = 1.5
        var minScale:CGFloat = 0.8
    
        @IBAction func handlePinch(_ pinchGesture: UIPinchGestureRecognizer) {
            guard pinchGesture.view != nil else {return}
    
            if pinchGesture.state == .began || pinchGesture.state == .changed{
                if (recognizerScale < maxScale && pinchGesture.scale > 1.0) {
                    pinchGesture.view?.transform = (pinchGesture.view?.transform)!.scaledBy(x: pinchGesture.scale, y: pinchGesture.scale)
                    recognizerScale *= pinchGesture.scale
                    pinchGesture.scale = 1.0
                }
                if (recognizerScale > minScale && pinchGesture.scale < 1.0) {
                    pinchGesture.view?.transform = (pinchGesture.view?.transform)!.scaledBy(x: pinchGesture.scale, y: pinchGesture.scale)
                    recognizerScale *= pinchGesture.scale
                    pinchGesture.scale = 1.0
                }
            }
        }
    
    1. 为了将视图放在前面,我创建了多个 UIPanGestureRecognizers 并添加了 BringSubviewToFront:
         @IBAction func handlePan1(recognizer:UIPanGestureRecognizer) {
            let translation = recognizer.translation(in: self.view)
            if let view = recognizer.view {
                view.center = CGPoint(x:view.center.x + translation.x,
                                      y:view.center.y + translation.y)
            }
            view.bringSubviewToFront(view1)
            recognizer.setTranslation(CGPoint.zero, in: self.view)
        }
    
         @IBAction func handlePan2(recognizer:UIPanGestureRecognizer) {
            let translation = recognizer.translation(in: self.view)
            if let view = recognizer.view {
                view.center = CGPoint(x:view.center.x + translation.x,
                                      y:view.center.y + translation.y)
            }
            view.bringSubviewToFront(view2)
            recognizer.setTranslation(CGPoint.zero, in: self.view)
        }
    

    ecc... 但如果您还想限制平移手势,则无法执行此操作,因此您可能需要添加一个轻击手势识别器:

    为您的视图添加一个手势识别器并设置委托。

    @IBAction func tappedView1(recognizer: UITapGestureRecognizer) {
            view.bringSubviewToFront(myView)
        }
    

    在你看来DidLoad:

     let tap = UITapGestureRecognizer(target: self, action: #selector(tappedView1))
            tap.cancelsTouchesInView = false
            self.view.addGestureRecognizer(tap)
    
    1. 要设置屏幕限制/平移限制,我找到了这段代码:
    @IBAction func handlePan(recognizer:UIPanGestureRecognizer) {
            let translation = recognizer.translation(in: self.view)
            let statusFrame = UIApplication.shared.statusBarFrame
    
    
            if let recognizerView = recognizer.view {
                if recognizerView.frame.origin.x < 0.0 {
                    recognizerView.frame.origin = CGPoint(x: 0.0, y: recognizerView.frame.origin.y)
                }
                if recognizerView.frame.origin.y < statusFrame.height {
                    recognizerView.frame.origin = CGPoint(x: recognizerView.frame.origin.x, y: statusFrame.height)
                }
                if recognizerView.frame.origin.x + recognizerView.frame.size.width > view.frame.width {
                    recognizerView.frame.origin = CGPoint(x: view.frame.width - recognizerView.frame.size.width, y: recognizerView.frame.origin.y)
    
                }
                if recognizerView.frame.origin.y + recognizerView.frame.size.height > view.frame.height {
                    recognizerView.frame.origin = CGPoint(x: recognizerView.frame.origin.x, y: view.frame.height - recognizerView.frame.size.height)
                }
            }
    
            if let centerX = recognizer.view?.center.x, let centerY = recognizer.view?.center.y {
                recognizer.view?.center = CGPoint.init(x: centerX + translation.x , y: centerY + translation.y)
                recognizer.setTranslation(CGPoint.zero, in: self.view)
            }
    
            view.bringSubviewToFront(view1)
            recognizer.setTranslation(CGPoint.zero, in: self.view)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多