如何:点击时将视图置于前面;设置最大/最小捏合手势比例;将屏幕限制设置为平移手势

2024-03-15

注意:我发现的所有东西都太旧了,或者与我实际需要的东西相差太大,而且我几乎尝试了我发现的所有东西,但没有一个能以正确的方式工作。

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

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

这是我的代码:

https://github.com/marybnq/Views https://github.com/marybnq/Views


我解决了我的问题!

  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. 为了将视图带到前面,我创建了多个 UIPanGestureRecognizer 并添加了 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... 但是如果您还想限制平移手势,则无法执行此操作,因此您可能需要添加点击手势识别器:

将gestureRecognizer添加到您的视图中并设置委托。

@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)
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何:点击时将视图置于前面;设置最大/最小捏合手势比例;将屏幕限制设置为平移手势 的相关文章

  • Django 在模板中显示 render_to_response

    您好 提前谢谢您 我知道这完全是菜鸟问题 我已经在各个论坛中进行了搜索并阅读并重新阅读了文档 所以请保持温和 我有一个看法 views py from django shortcuts import render to response f
  • ExpandableListAdapter 在什么条件下调用 getChildView()

    在我的应用程序中 getChildView 在我里面可扩展列表适配器当适配器返回正确的子计数时 当getChildrenCount 叫做 我的问题是 为了让 ExpandableListAdapter 膨胀其子项 需要满足哪些条件 当组和子
  • Android - setRequestedOrientation - 活动和视图生命周期

    我在使用 JNI 的本机代码方面遇到了一些问题 我怀疑这可能是由于调用setRequestedOrientation 当我打电话时活动会发生什么setRequestedOrientation 是刚刚重新启动还是完全被破坏了 另外 视图会发生
  • Swift 4 JSON Codable - 返回的值有时是一个对象,其他是一个数组

    我从 API 获取的数据返回单个对象 但当有多个对象时 它会返回同一键中的数组 对于我正在使用的当前模型 结构 当数组出现时解码会失败 这些结果是随机排序的 这意味着我不知道何时会收到对象或数组 有没有办法创建一个模型 考虑到这一事实 并可
  • ViewPager内部的TextView拦截触摸事件

    我有一个ViewPager包含两个片段 在任何片段中我都可以触摸一个地方 滑动即可切换到另一个地方fragment 其中一个片段包含一个列表 列表中的项目包含一项TextView和一个ImageView 问题是 如果您是从点击开始拖动的Im
  • Laravel 5 Blade 在出现错误时显示空白页而不是抛出异常

    在 laravel 4 中 当你尝试渲染一个不存在的视图时应用程序 视图或者带有未定义变量的视图 laravel 将抛出异常或显示有助于调试的错误 我全新安装了 laravel 5 0 13 并且在对刀片模板进行故障排除时遇到了困难 该模板
  • iOS:在 UI(Sub)Views 中处理 UIGestureRecognisers

    我想知道如何最好地解决以下问题 我有一个 ViewController 它的视图包含大量复杂的子视图 UIView的子类 由于复杂性 其中一些 UIView 初始化自己的 UIGestureRecognisers 并实现相应的目标操作 因为
  • Grails:如何更改默认视图位置?

    我有控制器AdminTagController 默认情况下视图将位于 adminTag文件夹 是否可以将此控制器的默认文件夹更改为 admin view 我可以为每个方法指定视图 但这并不酷 谢谢 可以用以下命令更改它拦截器后 http g
  • 如何TDD UIGestureRecognizers?

    在尝试使用 UIGestureRecognizer 编写 TDD 代码时 我发现无法以编程方式验证目标操作 如果没有这个 我不确定我是否可以正确测试它 如果手势识别器在 IB 中设置 支持 iOS 5 则目标动作会在 NIB Storybo
  • 来自字符串的 Swift Keypath

    有没有办法在 Swift 4 中从字符串创建 Keypath 以通过路径或变量名访问结构中的值 最后我发现我应该使用 CodingKeys 而不是 KeyPaths 通过 String 访问结构体变量的值 提前致谢 迈克尔 考虑你有这样的东
  • JSF 2.0 隐式导航,不同的观点

    我正在寻找对 JSF 2 0 隐式导航及其如何与视图一起工作的良好解释 更准确地说 我知道从操作方法中我可以返回一个字符串 它是操作的结果 如果存在文件名与结果匹配的 JSF 视图 那么这就是隐式导航 现在 我的问题是 如果从文件夹内的视图
  • Swift 返回类型说明

    我看到一个 Swift 函数写如下 func calculation imageRef CGImage gt red UInt green UInt blue UInt 我需要知道上面函数的返回类型是什么 我无法将它与任何已知类型联系起来
  • 将数据传递给视图时,node ejs 引用错误数据未在 eval 处定义

    我已经接近使用express和ejs的节点应用程序 但是当我尝试将数据从控制器传递到我的视图时 如下所示 var myData theData data res render path join dirname views index my
  • emberjs 对一条路线使用多个路径/url

    在 Ember 中我可以使用这个 App Router map function this route accomodations 因此 如果访问 accomodations 它将加载该视图 我还可以补充 App Router map fu
  • 无法构建 Objective-C 模块“Firebase”

    我收到此错误的原因是import Firebase 无法构建 Objective C 模块 Firebase Xcode 还抱怨 FirebaseAnalytics 说 找不到 FirebaseAnalytics FirebaseAnaly
  • Android 如何从我的应用程序使用 SD 卡中的文件路径预览图像

    文件存在于sdcard image jpg我想创建我自己的应用程序 活动 按下按钮时 需要使用内置图像查看器显示存储在 SD 卡中的图像 按图像查看器中的后退按钮后 它应该返回到我正在运行的应用程序 需要一些帮助 您可以为此创建一个具有适当
  • 此集合实例 Laravel 关系中不存在属性 [X]

    我在 Laravel 5 6 中使用了很多 Realtions 当我添加 phonebooks 时 我看到所有关系都工作正常 一切都很好 但是当我尝试在视图中显示它们时 我得到了属性在此集合上不存在的错误 这是关系代码 public fun
  • 如何在视图中调用 Grails 服务?

    简单的问题 我有一个服务类 比方说helpersService 和一个方法def constructURI params 如何从模板视图调用此方法 我尝试了以下代码但没有成功 img src 但我得到以下结果 No signature of
  • 如何创建克隆重复视图?

    在我的 Android 应用程序中 我想创建重复的ImageButton已经创建的Imagebutton 我想创造新的Imagebutton以编程方式与 XML 文件中已创建的按钮具有相同的宽度 高度 背景 图像源 边距等 简而言之 我想创
  • 在代码 MVC Razor 中渲染部分视图

    我正在使用 MVC 3 Razor 制作一个简单的 CMS 以用于实践目的 我的想法是创建一些部分视图 我想要进行数据库查找 并发现 3 个部分视图需要渲染到页面 我该怎么做 在 WebForms 中 您可以调用 LoadControl C

随机推荐