活动介绍

iOS开发:手势识别与网络异步下载全解析

立即解锁
发布时间: 2025-08-17 01:56:35 阅读量: 31 订阅数: 29 AIGC
PDF

iOS 6编程实战指南

### iOS开发:手势识别与网络异步下载全解析 #### 1. iOS手势识别概述 在iOS开发中,手势识别是提升用户交互体验的重要部分。通过不同的手势识别器,能让用户以直观的方式与应用进行交互,以下将详细介绍几种常见的手势识别器及其应用。 #### 2. 平移手势识别器(UIPanGestureRecognizer) 平移手势识别器 `UIPanGestureRecognizer` 可以检测用户的平移手势。在识别平移手势时,它会经历以下几个状态: 1. `UIGestureRecognizerStateBegan` 2. `UIGestureRecognizerStateChanged` 3. `UIGestureRecognizerStateEnded` 我们可以按照以下方式实现手势识别器的目标方法,让标签的中心随着用户手指的移动而持续移动: ```objc - (void) handlePanGestures:(UIPanGestureRecognizer*)paramSender{ if (paramSender.state != UIGestureRecognizerStateEnded && paramSender.state != UIGestureRecognizerStateFailed){ CGPoint location = [paramSender locationInView:paramSender.view.superview]; paramSender.view.center = location; } } ``` 为了能在视图控制器的视图上移动标签,我们需要获取手指在视图上的位置,而不是标签上的位置。因此,我们调用了平移手势识别器的 `locationInView:` 方法,并将标签的父视图作为目标视图传入。 可以使用平移手势识别器的 `locationInView:` 方法来查找当前平移手指的位置。若要检测多个手指的位置,则使用 `locationOfTouch:inView:` 方法。通过 `UIPanGestureRecognizer` 的 `minimumNumberOfTouches` 和 `maximumNumberOfTouches` 属性,你可以同时检测多个平移触摸。在示例中,为了简单起见,我们只检测一个手指。 在 `UIGestureRecognizerStateEnded` 状态下,报告的 x 和 y 值可能不是数字,即可能等于 `NAN`。所以,我们需要避免在这个特定状态下使用报告的值。 #### 3. 长按手势识别器(UILongPressGestureRecognizer) ##### 3.1 问题与解决方案 如果你想检测用户在视图上点击并按住手指一段时间的操作,可以创建一个 `UILongPressGestureRecognizer` 类的实例,并将其添加到需要检测长按手势的视图中。 视图控制器的 `.h` 文件定义如下: ```objc #import <UIKit/UIKit.h> @interface Detecting_Long_Press_GesturesViewController : UIViewController @property (nonatomic, strong) UILongPressGestureRecognizer *longPressGestureRecognizer; @property (nonatomic, strong) UIButton *dummyButton; @end ``` 视图控制器的 `viewDidLoad` 实例方法如下: ```objc - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; self.dummyButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; self.dummyButton.frame = CGRectMake(0.0f, 0.0f, 72.0f, 37.0f); self.dummyButton.center = self.view.center; [self.view addSubview:self.dummyButton]; /* First create the gesture recognizer */ self.longPressGestureRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressGestures:)]; /* The number of fingers that must be present on the screen */ self.longPressGestureRecognizer.numberOfTouchesRequired = 2; /* Maximum 100 points of movement allowed before the gesture is recognized */ self.longPressGestureRecognizer.allowableMovement = 100.0f; /* The user must press two fingers (numberOfTouchesRequired) for at least one second for the gesture to be recognized */ self.longPressGestureRecognizer.minimumPressDuration = 1.0; /* Add this gesture recognizer to the view */ [self.view addGestureRecognizer:self.longPressGestureRecognizer]; } ``` 如果长按手势识别器在用户端手势持续进行时向接收对象发送事件,而此时有电话或其他中断进来,手势识别器的状态将变为 `UIGestureRecognizerStateCancelled`。在用户再次发起启动识别过程所需的操作(在此示例中,在视图控制器的视图上用两个手指按住至少一秒)之前,该手势识别器不会再向接收对象发送任何消息。 ##### 3.2 长按手势识别器的重要属性 长按手势识别器有四个重要属性会影响其识别行为,具体如下: | 属性 | 描述 | 默认值 | | ---- | ---- | ---- | | `numberOfTapsRequired` | 用户在触发手势之前必须在目标视图上执行的点击次数。点击是指将手指放在屏幕上并抬起的动作。 | 0 | | `numberOfTouchesRequired` | 在识别手势之前必须触摸屏幕的手指数量。如果 `numberOfTapsRequired` 属性设置为大于 0 的值,则必须指定相同数量的手指来检测点击。 | 无 | | `allowableMovement` | 在手势识别中止之前,屏幕上的手指可以移动的最大像素数。 | 无 | | `minimumPressDuration` | 用户必须将手指按在屏幕上的时间(以秒为单位),才能检测到手势事件。 | 无 | 在示例中,这些属性的设置如下: - `numberOfTapsRequired`:默认值(我们未更改此值) - `numberOfTouchesRequired`:2 - `allowableMovement`:100 - `minimumPressDuration`:1 有了这些值,只有当用户按下屏幕并按住两个手指一秒钟(`minimumPressDuration`),且手指移动不超过 100 像素(`allowableMovement`)时,长按手势才会被识别。 当手势被识别时,会调用 `handleLongPressGestures:` 方法,我们可以按以下方式实现: ```objc - (void) handleLongPressGestures:(UILongPressGestureRecognizer *)paramSender{ /* Here we want to find the midpoint of the two fingers that caused the long press gesture to be recognized. We configured this number using the numberOfTouchesRequired property of the UILongPressGestureRecognizer that we instantiated in the viewDidLoad instance method of this View Controller. If we find that another long press gesture recognizer is using this method as its target, we will ignore it */ if ([paramSender isEqual:self.longPressGestureRecognizer]){ if (paramSender.numberOfTouchesRequired == 2){ CGPoint touchPoint1 = [paramSender locationOfTouch:0 inView:paramSender.view]; CGPoint touchPoint2 = [paramSender locationOfTouch:1 inView:paramSender.view]; CGFloat midPointX = (touchPoint1.x + touchPoint2.x) / 2.0f; CGFloat midPointY = (touchPoint1.y + touchPoint2.y) / 2.0f; CGPoint midPoint = CGPointMake(midPointX, midPointY); self.dummyButton.center = midPoint; } else { /* This is a long press gesture recognizer with more or less than 2 fingers */ } } } ``` iOS 中的地图应用就是使用长按手势识别器的一个例子。在该应用中,当你查看不同位置时,将手指按在特定位置并按住一段时间而不抬起,会在该特定位置放下一个图钉。 #### 4. 点击手势识别器(UITapGestureRecognizer) ##### 4.1 问题与解决方案 如果你想检测用户点击视图的操作,可以创建一个 `UITapGestureRecognizer` 类的实例,并使用 `UIView` 类的 `addGestureRecognizer:` 实例方法将其添加到目标视图中。 视图控制器的 `.h` 文件定义如下: ```objc #import <UIKit/UIKit.h> @interface Detecting_Tap_GesturesViewController : UIViewController @property (nonatomic, strong) UITapGestureRecognizer *tapGestureRecognizer; @end ``` 视图控制器的 `viewDidLoad` 实例方法实现如下: ```objc - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; /* Create the Tap Gesture Recognizer */ self.tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTaps:)]; /* The number of fingers that must be on the screen */ self.tapGestureRecognizer.numberOfTouchesRequired = 2; /* The total number of taps to be performed before the gesture is recognized */ self.tapGestureRecognizer.numberOfTapsRequired ```
corwn 最低0.47元/天 解锁专栏
赠100次下载
继续阅读 点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

陆鲁

资深技术专家
超过10年工作经验的资深技术专家,曾在多家知名大型互联网公司担任重要职位。任职期间,参与并主导了多个重要的移动应用项目。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看
立即解锁

专栏目录

最新推荐

模型生产化:从本地部署到云端容器化

# 模型生产化:从本地部署到云端容器化 ## 1. 引入 FastAPI 在将模型投入生产的过程中,我们首先要安装 FastAPI。由于 FastAPI 是一个 Python 模块,我们可以使用 pip 进行安装。打开一个新的终端,运行以下命令: ```bash $ pip install fastapi uvicorn aiofiles jinja2 ``` 这里我们安装了一些 FastAPI 所需的额外依赖项。uvicorn 是一个用于设置 API 的底层服务器/应用程序接口,而 aiofiles 则使服务器能够异步处理请求,例如同时接受和响应多个独立的并行请求。这两个模块是 FastA

多视图检测与多模态数据融合实验研究

# 多视图检测与多模态数据融合实验研究 ## 1. 多视图检测实验 ### 1.1 实验数据集 实验参考了Wildtrack数据集和MultiviewX数据集,这两个数据集的特点如下表所示: | 数据集 | 相机数量 | 分辨率 | 帧数 | 区域面积 | | ---- | ---- | ---- | ---- | ---- | | Wildtrack | 7 | 1080×1920 | 400 | 12×36 m² | | MultiviewX | 6 | 1080×1920 | 400 | 16×25 m² | ### 1.2 评估指标 为了评估算法,使用了精度(Precision)、

二维和三维偏微分方程耦合求解及生命科学中常微分方程问题的解决

### 二维和三维偏微分方程耦合求解及生命科学中常微分方程问题的解决 #### 1. 二维和三维偏微分方程耦合求解 在求解二维和三维偏微分方程时,有几个具体的问题和解决方法值得探讨。 ##### 1.1 获取相同网格点的 v 值 要在与 u 相同的网格点上获取 v 值,可以输入以下命令: ```matlab >> T_table=tri2grid(p,t,u(length(p)+1:end,end),x,y) ``` 示例结果如下: ``` T_table = 0.6579 0.5915 0.5968 0.6582 0 0.6042 0.4892 0.5073 0.6234 0 0.543

强化学习与合成数据生成:UnityML-Agents深度解析

# 强化学习与合成数据生成:Unity ML - Agents 深度解析 ## 1. 好奇心奖励与超参数设置 在强化学习中,为了激发智能体的好奇心,可以传递与外在奖励相同的超参数。具体如下: - **好奇心奖励信号超参数**: - `reward_signals->curiosity->strength`:用于平衡好奇心奖励与其他奖励(如外在奖励)的缩放系数,取值范围在 0.0 到 1.0 之间。 - `reward_signals->curiosity->gamma`:根据奖励实现所需的时间来调整奖励感知价值的第二个缩放系数,与外在奖励的 `gamma` 类似,取值范围也在

使用PyTorch构建电影推荐系统

### 使用 PyTorch 构建电影推荐系统 在当今数字化时代,推荐系统在各个领域都发挥着至关重要的作用,尤其是在电影推荐领域。本文将详细介绍如何使用 PyTorch 构建一个电影推荐系统,从数据处理到模型训练,再到最终的推荐生成,为你呈现一个完整的推荐系统构建流程。 #### 1. 数据探索与处理 首先,我们需要对 MovieLens 数据集进行探索和处理。该数据集包含用户对电影的评分信息,其中存在一些缺失的评分值,用 NaN 表示。我们的目标是利用非空评分训练推荐系统,并预测这些缺失的评分,从而为每个用户生成电影推荐。 以下是处理数据集的代码: ```python import p

利用Kaen实现PyTorch分布式训练及超参数优化

### 利用Kaen实现PyTorch分布式训练及超参数优化 #### 1. 启用PyTorch分布式训练支持 在进行模型训练时,我们可以使用Kaen框架来支持PyTorch的分布式训练。以下是相关代码示例: ```python train_glob = os.environ['KAEN_OSDS_TRAIN_GLOB'] if 'KAEN_OSDS_TRAIN_GLOB' in os.environ else 'https://raw.githubusercontent.com/osipov/smlbook/master/train.csv' val_glob = os.environ['

利用PyTorch进行快速原型开发

### 利用 PyTorch 进行快速原型开发 在深度学习领域,快速搭建和验证模型是非常重要的。本文将介绍两个基于 PyTorch 的高级库:fast.ai 和 PyTorch Lightning,它们可以帮助我们更高效地进行模型的训练和评估。 #### 1. 使用 fast.ai 进行模型训练和评估 fast.ai 是一个基于 PyTorch 的高级库,它可以让我们在几分钟内完成模型的训练设置。下面是使用 fast.ai 训练和评估手写数字分类模型的步骤: ##### 1.1 模型训练日志分析 在训练过程中,我们可以看到冻结网络的第一个训练周期,然后是解冻网络的两个后续训练周期。日志中

电力电子中的Simulink应用:锁相环、静止无功补偿器与变流器建模

# 电力电子中的Simulink应用:锁相环、静止无功补偿器与变流器建模 ## 1. 锁相环(PLL) ### 1.1 锁相环原理 锁相环(PLL)是一种控制算法,用于确定正弦输入的频率和相位角。它主要用于两个系统之间的频率匹配,匹配完成后会存在一个恒定的相位差,从而实现相位“锁定”。PLL由相位检测机制、PID控制器和用于生成相位角信息的振荡器组成。此外,系统中还包含一个低通滤波器,用于获取正弦输入的频率信息。在柔性交流输电系统(FACTS)设备中,PLL增益对稳定系统性能起着至关重要的作用。 ### 1.2 Simulink环境下的PLL设置 为了直观展示PLL如何反映频率和相位的变化

模糊推理系统对象介绍

# 模糊推理系统对象介绍 ## 1. fistree 对象 ### 1.1 概述 fistree 对象用于表示相互连接的模糊推理系统树。通过它可以创建一个相互关联的模糊推理系统网络。 ### 1.2 创建方法 可以使用以下语法创建 fistree 对象: ```matlab fisTree = fistree(fis,connections) fisTree = fistree( ___ ,'DisableStructuralChecks',disableChecks) ``` - `fisTree = fistree(fis,connections)`:创建一个相互连接的模糊推理系统对象

PyTorch神经网络构建与训练全解析

### PyTorch 神经网络构建与训练全解析 #### 1. 特征标准化 在很多情况下,对特征进行标准化是一个很好的做法,即使并非总是必要(例如当所有特征都是二元特征时)。标准化的目的是让每个特征的值具有均值为 0 和标准差为 1 的特性。使用 scikit-learn 的 `StandardScaler` 可以轻松完成这一操作。 然而,如果你在创建了 `requires_grad=True` 的张量后需要进行标准化操作,就需要在 PyTorch 中直接实现,以免破坏计算图。以下是在 PyTorch 中实现特征标准化的代码: ```python import torch # Creat