将 UIView 移动限制为仅垂直或水平轴

2024-04-10

我正在使用 PanGestureRecognizer,并在 UIGestureRecognizerStateChanged 中让用户手指移动屏幕上的视图。我将其用于 Tinder 之类的滑动手势,现在我想将视图的移动限制在水平轴或垂直轴上,无论用户开始滑动的方向如何。我在这里上下寻找,但没有找到合适的东西。

是否有任何巧妙的方法来根据用户开始滑动视图的方向来限制轴移动?

非常感谢!

更新:这是移动视图的当前代码:

- (void)dragged:(UIPanGestureRecognizer *)gestureRecognizer
{
    CGFloat xDistance = [gestureRecognizer translationInView:self].x;
    CGFloat yDistance = [gestureRecognizer translationInView:self].y;
//    xDistance = 0;

    [parentView dragged:yDistance];

    switch (gestureRecognizer.state) {
        case UIGestureRecognizerStateBegan:{
            self.originalPoint = self.center;
            break;
        };
        case UIGestureRecognizerStateChanged:{
            CGFloat rotationAngel = 0;
            CGFloat scale = 1;//MAX(scaleStrength, 0.93);
            CGAffineTransform transform = CGAffineTransformMakeRotation(rotationAngel);
            CGAffineTransform scaleTransform = CGAffineTransformScale(transform, scale, scale);
            self.transform = scaleTransform;
            self.center = CGPointMake(self.originalPoint.x + xDistance, self.originalPoint.y + yDistance);
            ...
            break;
        };
        case UIGestureRecognizerStateEnded: {
            float moveDistAction = 60;
            if (yDistance > moveDistAction) {
                // view swiped down
                ...
            } else if (yDistance < -moveDistAction) {//100 150
                // view swiped up 
                ...
            } else {
                // dragging cancelled
                ...
            }
            break;
        };
        case UIGestureRecognizerStatePossible:break;
        case UIGestureRecognizerStateCancelled:break;
        case UIGestureRecognizerStateFailed:break;
    }
}

In gestureRecognizerShouldBegin:你可以知道那个方向:

- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
    CGPoint translation = [gestureRecognizer translationInView:self.view];
    self.isVerticalPan = fabs(translation.y) > fabs(translation.x); // BOOL property

    return YES;
}

然后在UIGestureRecognizerStateChanged你可以做这样的事情,基于isVerticalPan财产:

CGPoint translation = [gesture translationInView:self.view];
CGPoint displacement = (self.isVerticalPan) ? CGPointMake(0, translation.y) : CGPointMake(translation.x, 0);

self.viewToMove.transform = CGAffineTransformMakeTranslation(displacement.x, displacement.y);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 UIView 移动限制为仅垂直或水平轴 的相关文章

随机推荐

  • 用拼凑的方式组合和合并 ggplot2 中的图例

    我想结合两个或多个情节来融合他们的传奇 例如 我可以创建一些数据和两个场景 如下所示 packages library ggplot2 library patchwork first plot set seed 07042020 x lt
  • 我如何知道 Perl 正则表达式的哪一部分与字符串匹配?

    我想搜索文件的行以查看其中是否有任何行与一组正则表达式中的一个匹配 像这样的东西 my regs qr a qr b qr c foreach my line
  • jQuery 对话框回发但 UpdatePanel 未更新

    我想从代码隐藏中显示 jQuery UI 对话框 并且需要在回发后刷新它 该对话框是用于过滤和查找数据的控件 因此 用户从 DropDownLists 中进行选择并在 TextBoxes 中输入文本 单击 Apply Button 发生异步
  • 最佳数据库变更控制方法

    作为数据库架构师 开发人员和顾问 有很多问题可以回答 其中之一 虽然我最近被问到 但仍然无法很好地回答 那就是 保持数据库变更记录 组织并能够在单开发人员或多开发人员环境中有效推出的最佳方法或技术之一是什么 这可能涉及存储过程和其他对象脚本
  • Entity Framework 4 Code-First 多对多插入

    我在数据库层使用代码优先模式 我有两个 POCO 课程 public class Order Key public int OrderId get set public virtual ICollection
  • “float”对象没有属性“__getitem__”Python错误

    当我运行代码时 import numpy as np from scipy integrate import odeint import matplotlib pyplot as plt Initial conditions def f f
  • ChrW(e.KeyCode) 在 C# 中的等价物是什么?

    在VB NET 2008中 我使用了以下语句 MyKeyChr ChrW e KeyCode 现在我想将上面的语句转换成C 有任何想法吗 快速而肮脏的相当于ChrW在 C 中只是将值转换为char char MyKeyChr char e
  • WTForms:在编写自定义验证时传递额外参数

    写作时wtforms 的自定义验证 http wtforms simplecodes com docs 0 6 validators html 是否可以传递额外的参数 如请求 For e g class MyForm Form name T
  • 从 2 元组列表生成最大数量的 3 元组

    我有一个 2 元组列表 并希望从该列表中生成尽可能多的 3 元组 例子 usr bin python import itertools a list itertools combinations 1 2 3 4 5 6 7 8 9 2 i
  • 如何使用 RSpec 测试获取目录中的文件列表?

    我对 RSpec 的世界还很陌生 我正在编写一个 RubyGem 它处理指定目录和任何子目录中的文件列表 具体来说 它将使用Find find并将文件附加到数组以供以后输出 我想编写一个规范来测试这种行为 但真的不知道从哪里开始伪造文件目录
  • 处理大量输入参数、大量输出

    我需要进行一个复杂的计算 就我而言 创建一个计算器类 使用策略模式抽象 似乎是最自然的 为了执行计算 该类需要接受大约 20 个输入 其中一些是可选的 其中一些可能在将来发生变化等 计算 调用方法时 需要输出大约20个不同的变量 有多种方法
  • javascript apply 和 call 方法并链接在一起

    在本文中js日志函数 https gist github com bgrins 5108712 signup true 有一个说法 Function prototype apply call console log 控制台 参数 我对这个说
  • 创建垂直分隔符 Jetpack Compose

    如何使用 Jetpack Compose 创建垂直分隔线 我尝试使用 Spacer 和 Box 来做到这一点 但它根本不显示 这是我尝试过的 Box modifier Modifier fillMaxHeight width 2 dp ba
  • R:使用 marrangeGrob 在空白首页制作 pdf 结果

    我正在制作一些每页上有多个图形的 pdf 文件 并且当我使用 gridextra 包中的 marrangeGrob 来制作这些图形时 第一页始终是空白的 如何使绘图从第一页开始 这是一些示例代码 library gridextra libr
  • IPHONE:ABPeoplePickerNavigationController 隐藏导航栏

    您好 我有一个 ABPeoplePickerNavigationController 在创建时设置其 导航栏隐藏 peoplePickerController navigationBar hidden YES 这工作得很好 唯一的问题是当用
  • Youtube API 和跟踪嵌入视频

    目前的问题是在一个页面上嵌入多个 Youtube 视频 但现在 Youtube 分析无法正常工作 以前我在 Drupal 页面上有很多嵌入视频 但该网站对 SEO 不友好 页面速度很慢 许多嵌入的 Youtube 视频使用 js 和 css
  • 以编程方式调用委托中的故事板

    我正在尝试以编程方式调用我的故事板 我的故事板由以下内容组成 导航控制器 gt MainMenuView gt DetailsView MainMenu 标识符被放置在 MainMenuView 中 我遇到的问题是屏幕显示空白 我需要做什么
  • Devise Omniauth - 设置和定义策略

    我尝试问这个问题 但没有找到任何帮助 http stackoverflow com questions 33493369 rails devise omniauth problems with setup 我放弃了解决问题的尝试 并制作了一
  • boost::asio::bind_executor 不在链中执行

    以下示例在没有断言的情况下完成 include
  • 将 UIView 移动限制为仅垂直或水平轴

    我正在使用 PanGestureRecognizer 并在 UIGestureRecognizerStateChanged 中让用户手指移动屏幕上的视图 我将其用于 Tinder 之类的滑动手势 现在我想将视图的移动限制在水平轴或垂直轴上