斯威夫特:如何设置最大/最小平移手势?

Posted

技术标签:

【中文标题】斯威夫特:如何设置最大/最小平移手势?【英文标题】:Swift: How to set max/min to pan gesture? 【发布时间】:2019-03-19 21:35:42 【问题描述】:

注意:我已经尝试过找到的其他答案,但没有任何效果。

我需要为可以在主视图周围拖动的 UIView 设置屏幕限制(这样我就不能将它拖到视图之外)。另外我想知道如何让这个屏幕限制适应不同的设备。

@IBAction func handlePan(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)

recognizer.setTranslation(CGPoint.zero, in: self.view)

【问题讨论】:

使用UIPanGesture 设置允许用户移动对象的区域的一个问题是,一旦对象的位置超出范围,他们将无法移动它。那你打算怎么做呢? 在手势的changed 状态下,只需声明您希望视图框架遵守的条件。例如,如果视图的框架的 y 原点小于 0,则它等于 0。这不会中断手势本身。 【参考方案1】:

下面展示了如何在视图控制器 (UIViewController) 的主视图上平移 UILabel 控件,以及如何将其平移运动限制在后者的可见边界内。请注意,假设状态栏是可见的。所以上边界是由状态栏的高度决定的。

import UIKit

class ViewController: UIViewController 
    // MARK: - Variables

    // MARK: - IBOutlet
    @IBOutlet weak var label: UILabel!

    // MARK: - IBAction

    // MARK: - Life cycle
    override func viewDidLoad() 
        super.viewDidLoad()

        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(handlePan(_:)))
        label.isUserInteractionEnabled = true
        label.addGestureRecognizer(panGesture)
    

    @objc func handlePan(_ sender: UIPanGestureRecognizer) 
        let translation = sender.translation(in: self.view)
        let statusFrame = UIApplication.shared.statusBarFrame

        if let senderView = sender.view 
            if senderView.frame.origin.x < 0.0 
                senderView.frame.origin = CGPoint(x: 0.0, y: senderView.frame.origin.y)
            
            if senderView.frame.origin.y < statusFrame.height 
                senderView.frame.origin = CGPoint(x: senderView.frame.origin.x, y: statusFrame.height)
            
            if senderView.frame.origin.x + senderView.frame.size.width > view.frame.width 
                senderView.frame.origin = CGPoint(x: view.frame.width - senderView.frame.size.width, y: senderView.frame.origin.y)
            
            if senderView.frame.origin.y + senderView.frame.size.height > view.frame.height 
                senderView.frame.origin = CGPoint(x: senderView.frame.origin.x, y: view.frame.height - senderView.frame.size.height)
            
        

        if let centerX = sender.view?.center.x, let centerY = sender.view?.center.y 
            sender.view?.center = CGPoint.init(x: centerX + translation.x , y: centerY + translation.y)
            sender.setTranslation(CGPoint.zero, in: self.view)
        
    

【讨论】:

完美!如果您在情节提要上执行此操作,只需在“识别器”中更改“共享”即可

以上是关于斯威夫特:如何设置最大/最小平移手势?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 设置平移的最小/最大限制

如何设置平移手势的 y 轴范围?

将平移手势限制为设置帧

设置平移手势的界限

android手势如何平移控件

旋转后平移手势行为不正确