为什么你的TapGesture不生效?.NET MAUI手势识别疑难问题一网打尽

第一章:为什么你的TapGesture不生效?.NET MAUI手势识别疑难问题一网打尽

在 .NET MAUI 开发中,TapGestureRecognizer 是最常用的手势识别组件之一。然而,许多开发者常遇到点击事件不触发的问题,即便代码看似正确。这通常源于控件层级、输入启用状态或事件绑定逻辑的疏漏。

检查控件是否启用用户交互

默认情况下,某些布局容器(如 Label 或 Frame)的 InputTransparent 属性为 true,导致手势无法捕获。必须显式关闭该属性:
<Label Text="点击我" InputTransparent="False">
    <Label.GestureRecognizers>
        <TapGestureRecognizer Tapped="OnTappedHandler" NumberOfTapsRequired="1" />
    </Label.GestureRecognizers>
</Label>
上述代码中,InputTransparent="False" 确保标签可接收输入事件,Tapped 绑定处理方法,NumberOfTapsRequired 指定单击次数。

确保手势已正确附加到子元素

若父容器拦截触摸事件,子控件可能无法接收到手势。建议将手势直接添加至目标控件,而非其父布局。此外,动态添加手势时需确认控件已初始化:
var tap = new TapGestureRecognizer();
tap.Tapped += (s, e) => DisplayAlert("提示", "点击生效!", "确定");
tap.NumberOfTapsRequired = 1;
myImage.GestureRecognizers.Add(tap); // 确保 myImage 不为 null

常见问题排查清单

  • 控件的 IsEnabled 是否为 true
  • 是否存在覆盖层(如透明 Grid)阻挡了点击
  • 绑定的命令是否实现了 ICommand 接口且未返回 null
  • 事件处理方法是否被意外设为 private 且未正确反射调用
问题现象可能原因解决方案
完全无响应InputTransparent=true设置为 false
仅部分区域响应父容器尺寸异常检查布局约束

第二章:TapGesture基础原理与常见误区

2.1 TapGesture的工作机制与事件生命周期

事件触发流程
TapGesture 是一种基于触摸输入的手势识别器,通过监听用户在屏幕上的轻触行为实现交互响应。系统在检测到手指按下并抬起且未超出预设阈值时,判定为一次有效点击。
生命周期阶段
  • Began:触摸开始,手势进入识别阶段
  • Changed:触摸移动中,系统持续判断是否符合 Tap 条件
  • Ended:手指抬起,若满足时间与位移条件,则触发 action 回调
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
tapGesture.numberOfTapsRequired = 2
view.addGestureRecognizer(tapGesture)
上述代码创建了一个双击手势识别器。参数 `numberOfTapsRequired` 指定需连续点击两次才触发,系统内部通过计时与位置比对确保两次点击在相同区域且间隔较短。

2.2 手势冲突:多个手势共存时的优先级问题

在移动应用开发中,当多个手势识别器同时监听用户输入时,容易引发手势冲突。系统需明确判定哪个手势具有更高优先级,以确保交互流畅。
手势优先级判定机制
iOS 和 Android 均提供手势竞争处理机制。例如,在 iOS 中,通过 UIGestureRecognizerDelegate 的代理方法控制响应顺序:

func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
    shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
    return false // 默认不同时响应
}
该方法返回 false 时表示仅高优先级手势生效;返回 true 可支持并行识别,但需开发者手动协调逻辑冲突。
常见冲突场景与解决方案
  • 滑动手势与拖拽冲突:设定方向阈值区分意图
  • 双击与单击:通过延迟识别避免误判
  • 缩放与旋转:使用组合识别器统一处理多点输入

2.3 视图层级遮挡:为何点击区域无响应

在移动应用开发中,用户点击无响应的常见原因之一是视图层级(View Hierarchy)中的遮挡问题。当前台视图覆盖了底层可点击组件时,触摸事件将被上层视图截获,导致底层控件无法接收到输入。
常见遮挡场景
  • 透明或半透明浮层覆盖按钮
  • ConstraintLayout 中 z 轴顺序不当
  • 自定义 ViewGroup 拦截了 onTouchEvent
代码示例与分析
<FrameLayout>
  <Button android:id="@+id/btn_click" />
  <View android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:background="@android:color/transparent" />
</FrameLayout>
上述代码中,全屏透明 View 覆盖了 Button,尽管视觉不可见,但仍会拦截所有点击事件。解决方案包括设置 android:clickable="false" 或调整视图绘制顺序。
调试建议
使用 Android Studio 的 Layout Inspector 可直观查看视图堆叠顺序,定位遮挡源。

2.4 绑定失效:Command未正确关联的典型场景

在WPF或MVVM架构中,命令绑定失效是常见问题,尤其当ICommand未正确关联时,界面操作将无法触发预期逻辑。
典型原因分析
  • ViewModel中命令属性未实例化
  • 绑定路径错误或DataContext未正确设置
  • 命令的CanExecute始终返回false
代码示例与解析
public ICommand SaveCommand { get; private set; }

// 构造函数中必须实例化
public MyViewModel() 
{
    SaveCommand = new RelayCommand(OnSave, CanSave);
}

private bool CanSave(object parameter) => !string.IsNullOrEmpty(InputText);

private void OnSave(object parameter)
{
    // 执行保存逻辑
}
上述代码中,若未在构造函数中初始化SaveCommand,XAML中的Command="{Binding SaveCommand}"将绑定失败,导致按钮不可用。
调试建议
可通过调试输出DataContext和命令属性状态,确认绑定上下文是否正确。

2.5 可交互性设置:IsEnabled与InputTransparent的影响

在XAML控件开发中,IsEnabled与InputTransparent是控制用户交互行为的核心属性。它们虽看似相似,但作用机制截然不同。
属性功能对比
  • IsEnabled="False":禁用控件并呈现为灰色,用户无法与其交互
  • InputTransparent="True":控件不可接收输入事件,但视觉状态不变
典型应用场景
<StackLayout>
  <Button Text="正常按钮" IsEnabled="True" />
  <Button Text="禁用按钮" IsEnabled="False" />
  <Label Text="穿透标签" InputTransparent="True" BackgroundColor="LightBlue" />
</StackLayout>
上述代码中,第二个按钮不可点击且变灰;标签虽可见,但触摸事件会穿透至其下方的控件。
行为差异对照表
属性视觉变化事件响应事件传递
IsEnabled=False变灰无不传递
InputTransparent=True无无传递给下层

第三章:实战排查技巧与调试方法

3.1 使用调试输出验证事件是否触发

在开发过程中,确保事件按预期触发是排查逻辑错误的关键步骤。最直接的方式是通过调试输出观察事件的执行路径。
添加日志语句
在事件处理函数中插入调试信息,可快速确认其是否被调用:

func onUserLogin(event *UserLoginEvent) {
    log.Printf("DEBUG: UserLoginEvent triggered for user: %s", event.Username)
    // 处理登录逻辑
}
上述代码中,log.Printf 输出事件触发标志及关键参数,帮助开发者验证事件流是否进入该函数。
常见调试策略
  • 在事件发布前后插入日志,确认发布逻辑无误
  • 为不同事件类型设置唯一标识,便于区分输出
  • 结合条件断点,在特定输入下捕获事件
通过简单的输出验证,可有效排除事件未注册或通道阻塞等问题。

3.2 利用VisualTreeHelper定位命中测试问题

在WPF中,命中测试(Hit Testing)常用于判断用户输入是否作用于特定UI元素。当界面层级复杂时,直接通过逻辑树难以精确定位目标元素,此时可借助 VisualTreeHelper 遍历可视化树实现精准查找。
命中测试的基本流程
  • 注册鼠标事件并触发命中测试方法
  • 使用 VisualTreeHelper.HitTest 执行递归检测
  • 在回调函数中获取命中的视觉对象并处理逻辑
代码示例与分析
private void OnMouseDown(object sender, MouseButtonEventArgs e)
{
    Point point = e.GetPosition(myCanvas);
    VisualTreeHelper.HitTest(myCanvas, null, 
        result => {
            Console.WriteLine($"命中元素: {result.VisualHit}");
            return HitTestResultBehavior.Stop;
        }, 
        new PointHitTestParameters(point));
}
上述代码中,PointHitTestParameters 指定测试坐标,回调函数接收命中的视觉对象。返回 Stop 表示仅获取最顶层命中元素,提升性能。

3.3 模拟器与真机差异的对比分析

在移动应用开发中,模拟器与真机在运行环境上存在显著差异。性能表现方面,真机具备真实的CPU、GPU和内存资源,而模拟器依赖宿主机资源并引入额外抽象层,导致性能偏差。
关键差异维度
  • 传感器支持:真机提供完整的陀螺仪、加速度计等硬件数据,模拟器多采用模拟或静态值;
  • 网络延迟:真实网络波动无法在局域网环境下充分复现;
  • 渲染表现:GPU渲染路径不同,可能导致UI显示异常仅在真机暴露。
典型代码调试差异示例

// 获取设备亮度设置
ContentResolver cr = context.getContentResolver();
float brightness = Settings.System.getInt(cr, Settings.System.SCREEN_BRIGHTNESS, 255);
// 在模拟器中该值常被固定,无法反映真实用户环境
上述代码在多数模拟器中返回默认值,难以测试自动亮度调节逻辑,需在真机验证实际行为。
差异对照表
维度模拟器真机
启动速度快慢
硬件保真度低高
调试便利性高中

第四章:优化方案与最佳实践

4.1 合理布局确保手势区域可点击

在移动界面设计中,确保用户能够轻松触达交互元素是提升体验的关键。触摸目标的尺寸应符合人体工学标准,推荐最小点击区域为 44x44px,以适配大多数手指操作精度。
常见手势区域布局建议
  • 避免将高频操作按钮置于屏幕边缘或角落,防止误触与难以触及
  • 相邻可点击元素间应保留至少 8px 间距,降低误操作概率
  • 使用透明 padding 扩展点击热区,而不影响视觉表现
通过 CSS 增强可点击区域示例
.action-button {
  width: 36px;
  height: 36px;
  padding: 4px;
  box-sizing: border-box;
}
/* 实际点击区域 = 44x44px */
上述样式通过 padding 扩展了元素的可触控范围,同时保持图标大小不变,兼顾美观与可用性。结合 box-sizing: border-box 确保尺寸计算不超出预期。

4.2 使用GestureRecognizers集合管理多手势

在复杂交互界面中,单一手势识别已无法满足需求。通过将多个手势识别器集中管理,可实现更灵活的用户操作响应。
手势识别器集合的构建
使用 `GestureRecognizers` 集合可统一注册多种手势,如点击、长按、滑动等。系统会按优先级顺序处理冲突。

var gestureSet = new GestureRecognizers();
gestureSet.Add(new TapGestureRecognizer { NumberOfTapsRequired = 2 });
gestureSet.Add(new LongPressGestureRecognizer { Duration = TimeSpan.FromMilliseconds(500) });
element.GestureRecognizers = gestureSet;
上述代码注册了双击与长按手势。`NumberOfTapsRequired` 控制点击次数,`Duration` 定义长按触发阈值。集合内部自动协调事件优先级,避免冲突。
冲突处理与响应顺序
  • 手势按添加顺序进行优先级排序
  • 系统通过时间窗口判断手势类型
  • 可设置 CanBePreventedBy 限制某些手势的触发

4.3 封装可复用的TapGesture行为组件

在开发跨平台应用时,手势交互是提升用户体验的关键。将点击手势(Tap Gesture)封装为可复用的行为组件,有助于统一交互逻辑并降低代码冗余。
基础结构设计
通过自定义行为类继承 Behavior<TView>,约束其仅附加到特定视图类型:
public class TapGestureBehavior : Behavior<ContentView>
{
    protected override void OnAttachedTo(ContentView bindable)
    {
        var tapGestureRecognizer = new TapGestureRecognizer();
        tapGestureRecognizer.Tapped += OnTapped;
        bindable.GestureRecognizers.Add(tapGestureRecognizer);
    }

    private void OnTapped(object sender, EventArgs e)
    {
        // 执行命令或回调
    }

    protected override void OnDetachingFrom(ContentView bindable)
    {
        bindable.GestureRecognizers.Clear();
    }
}
上述代码中,OnAttachedTo 绑定点击识别器,OnDetachingFrom 确保资源释放,避免内存泄漏。
支持命令与参数传递
引入 Command 和 CommandParameter 属性,使组件支持 MVVM 模式下的命令绑定,提升灵活性与解耦程度。

4.4 结合MVVM模式实现解耦响应逻辑

在现代前端架构中,MVVM(Model-View-ViewModel)模式通过数据绑定机制有效分离UI与业务逻辑。ViewModel 作为中间桥梁,将 Model 的数据变化自动映射到 View 层,避免了手动操作DOM带来的耦合。
数据同步机制
通过双向绑定监听数据变更,当 Model 更新时,ViewModel 触发通知,驱动视图刷新:

class ViewModel {
  constructor(model) {
    this.model = model;
    this.model.addObserver(() => this.updateView());
  }
  updateView() {
    document.getElementById('output').textContent = this.model.data;
  }
}
上述代码中,addObserver 注册观察者,实现模型变化后自动调用视图更新方法,降低组件间依赖。
优势对比
模式耦合度维护性
MVC高中
MVVM低高

第五章:结语:构建稳定可靠的手势交互体验

设计原则与用户行为匹配
成功的手势交互始于对用户自然行为的理解。例如,在移动设备上,滑动返回操作已成为用户心智模型的一部分。开发者应遵循平台规范,如 iOS 的边缘滑动返回和 Android 的全局导航手势,避免自定义冲突。
  • 优先使用系统级支持的手势识别器(如 UIKit 的 UISwipeGestureRecognizer)
  • 为关键操作添加视觉提示,引导用户发现可交互区域
  • 避免多重嵌套手势,防止事件竞争
容错机制提升可用性
在真实场景中,用户手势往往存在偏差。实现鲁棒性需引入阈值控制和方向过滤:

// 示例:带角度容错的滑动手势判断
function isVerticalSwipe(dx, dy) {
  const angle = Math.abs(Math.atan2(dy, dx));
  return angle > Math.PI / 3; // 容许约60度内偏移
}
性能监控与反馈闭环
通过埋点追踪手势识别成功率、误触率等指标,形成优化闭环。以下为常见监控维度:
指标目标值采集方式
识别响应延迟<100ms时间戳差值计算
误触发率<5%用户撤销行为统计
跨平台一致性挑战
用户输入 → 事件归一化处理 → 平台适配层 → 核心逻辑执行
在 React Native 或 Flutter 等跨端框架中,需封装统一的 Gesture Manager 抽象层,屏蔽底层差异,确保行为一致。
KEIL5编译报错L6200E:__stdout重定义问题分析与解决 本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。 阅读详情

相关推荐

5分钟看懂LTE注网全流程:从PLMN选择到小区驻留的log分析技巧

本文深入解析了LTE终端从开机到成功驻留小区的完整流程,重点分享了基于QXDM和QCAT工具的log分析实战技巧。文章详细拆解了PLMN选择、System/Band扫频、小区搜索与同步、系统消息解析及驻留等关键步骤,并提供了高频问题场景的排查思路,帮助网络优化工程师快速定位终端侧、射频环境或网络配置问题。

app77的博客 432

TapGesture (SwiftUI中文文档手册)

TapGesture 识别一个或多个轻击的手势。 struct TapGesture 总览 要识别视图上的轻击手势,请创建并配置该手势,然后使用修饰符将其添加到视图中。以下代码向添加了点击手势,以切换圆圈的颜色。gesture(_:including:)Circle struct TapGestureView: View { @State var tapped = false var tap: some Gesture { TapGesture(count: 1)

iCloudEnd的博客 1043

从模拟到实战:移远EC800M单片机MQTT接入OneNet全流程解析

本文详细解析了移远EC800M单片机通过MQTT协议接入OneNet平台的全流程,涵盖环境准备、模拟设备搭建、硬件迁移、数据交互调试及性能优化等关键步骤。针对常见问题如AT指令缓冲区溢出、心跳间隔设置等提供实战解决方案,帮助开发者高效实现物联网设备稳定接入。

weixin_29215815的博客 432

SwiftUI中的手势(TapGesture、LongPressGesture、GestureState的使用)

手势操作在App中可谓是用途非常广泛了,常规的手势修饰符有`TapGesture`点击手势、`LongPressGesture`长按手势、`DragGesture`拖拽手势,`MagnificationGesture`放缩手势和 `RoationGesture`旋转手势。

郭永明的技术专栏 2654

华中科技大学计算机组成原理-单总线CPU设计(全部通关)

【计算机组成原理】 单总线CPU实验 华中科技大学-计算机组成原理 实验三 单总线CPU设计 第1关 MIPS指令译码器设计 第2关 单总线CPU微程序入口查找逻辑 第3关 单总线CPU微程序条件判别测试逻辑 第4关 单总线CPU微程序控制器设计 第5关 采用微程序的单总线CPU设计 第6关 现代时序硬布线控制器状态机设计 第7关 现代时序硬布线控制器设计

紫荆鱼的博客 4万+

74HC165级联踩坑实录:STM32读取32路开关状态,时序调试与常见问题排查

本文详细介绍了74HC165级联在STM32读取32路开关状态时的时序调试与常见问题排查。从硬件设计的PCB布局优化、电源噪声控制,到软件时序的精确调校和数据采集策略,提供了完整的解决方案。通过逻辑分析仪和示波器的高效使用,解决了信号延迟和干扰问题,最终实现了稳定可靠的32路信号读取。

weixin_34046298的博客 313

鸿蒙交互事件开发05——常用的6种手势类型

我们在鸿蒙交互事件开发04——手势事件中了解到,默认情况下,手势分为一下几种:👉🏻 TapGesture:点击手势,支持单次点击、多次点击的识别。👉🏻 LongPressGesture: 长按手势。👉🏻 PanGesture: 平移手势(滑动距离小于5vp时触发)👉🏻 PinchGesture: 捏合手势👉🏻 RotationGesture: 旋转手势👉🏻 SwipGesture: 滑动手势(滑动最小速度为100vp/s时触发)

harmonyClassRoom的博客 2462

从零开始搭建GD32F103CBT6开发环境:VSCode配置与实战技巧

本文详细介绍了如何从零开始为国产MCU GD32F103CBT6搭建高效的VSCode开发环境。内容涵盖工具链安装、VSCode核心插件配置、工程目录结构规划、关键配置文件编写以及Makefile实战,旨在帮助开发者摆脱传统IDE束缚,利用现代化工具链提升嵌入式开发效率。

weixin_29158413的博客 448

鸿蒙ArkTS声明式开发:跨平台支持列表【TapGesture】 基础手势

支持单击、双击和多次点击事件的识别。从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。

2401_82772199的博客 377

centos7部署mysql8.0.35,主从复制,主主集群

centos7 linux部署mysql,主从复制,主主模式

zaixiaqin的博客 1990

基于 STM32 的全自动洗车监控系统设计与实现

本文提出一种基于 STM32F103RCT6 芯片的全自动洗车监控系统方案,通过多传感器融合与智能控制算法,实现车辆检测、洗车流程自动化及状态远程监控。系统集成硬件选型、电路设计、软件流程及通信功能,可广泛应用于智能洗车场景。

weixin_42300449的博客 964

.NET MAUI手势命令深度优化:提升用户体验的7个专业技巧

掌握.NET MAUI手势识别命令的优化精髓,提升跨平台应用交互体验。本文详解7大专业技巧,涵盖常见手势的应用场景、命令绑定优化与响应性能提升策略,解决手势冲突与误触难题,显著增强用户操作流畅度,值得收藏。

PixelShoal的博客 353

QCC304x系列开发教程(基础篇)之2.1-QCC3040之开发环境搭建

一、安装MDE 1.解压qualcomm_mde.win.2.4_installer_2.4.1.4压缩包,安装MDE_WIN_2.4.1.4_x64.exe,路径自定义 点击NEXT, 安装完成后,点击Finish. 完成安装后,桌面生成快捷方式

心跳包的博客 6079

揭秘.NET MAUI手势交互:5步实现精准手势识别与命令绑定

掌握.NET MAUI手势交互精髓,5步实现精准手势识别命令绑定。适用于移动端常见手势操作,通过内置手势识别器与命令联动,提升用户体验。代码简洁、响应灵敏,跨平台开发更高效,值得收藏。

QuickTrans的博客 353

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

鸿蒙NEXT开发:ArkTS组件-手势处理(TapGesture)

支持单击、双击和多次点击事件的识别。

ZPYQAQ的博客 980

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

.NET MAUI手势识别实战(90%开发者忽略的关键细节)

掌握.NET MAUI手势识别命令的正确用法,解决跨平台触控交互难题。涵盖常见应用场景、自定义手势识别器实现方法及命令绑定技巧,提升用户操作体验。90%开发者忽略的关键细节全解析,值得收藏。

QuickProceed的博客 288

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

告别传统点击事件,.NET MAUI手势命令让你的应用瞬间灵动起来

掌握.NET MAUI 的手势识别命令,轻松实现滑动、捏合等交互操作,提升应用用户体验。适用于移动端多点触控场景,代码简洁易集成,告别传统点击事件束缚,让应用更灵动流畅,值得收藏。

SimSolve的博客 879

Bootstrap Blazor MAUI利用左右滑动手势实现返回

Bootstrap Blazor MAUI利用左右滑动手势实现返回

weixin_50478033的博客 407

【跨平台开发进阶】:基于.NET MAUI的手势识别与MVVM命令解耦最佳实践

掌握.NET MAUI手势交互新方式,本文深入解析手势识别命令在MVVM架构中的解耦实践。涵盖常见手势应用场景、命令绑定技巧及平台适配方案,提升代码可维护性与跨平台一致性,值得收藏。

LearnPlex的博客 324

【.NET MAUI开发者必看】:构建流畅交互的5大手势识别命令模式

掌握.NET MAUI手势识别命令,提升跨平台应用交互体验。本文详解5种常用手势命令模式,涵盖滑动、点击、缩放等场景,结合绑定命令实现响应式操作,代码简洁易集成。适用于移动端与平板开发,显著增强用户操作流畅度,值得收藏。

BytePerch的博客 375

为什么你的.NET MAUI应用手势不灵敏?7个性能优化要点必须掌握

解决.NET MAUI应用手势延迟问题,掌握7个关键优化策略。涵盖触摸事件处理、手势识别命令响应效率及UI线程优化等场景,提升交互流畅度。有效降低资源消耗,增强用户体验,值得收藏。

IterStream的博客 316

独家揭秘:.NET MAUI中隐藏的TapGesture高级特性与调试技巧

掌握.NET MAUI手势识别(TapGesture)的高级应用与调试技巧,解决多层视图点击冲突与快速连点问题。涵盖事件传递机制、自定义命令绑定及性能优化策略,提升交互精准度。开发必备技巧,值得收藏。

Instrustar的博客 802

告别复杂手势处理:.NET MAUI三行代码实现跨平台触摸交互

你是否还在为实现跨平台手势交互而编写大量平台特定代码?.NET MAUI (Multi-platform App UI) 的手势识别系统通过统一的API解决了这一痛点,让开发者能够使用C#为iOS、Android、Windows等平台创建一致的触摸体验。 MAUI手势系统的核心优势: - **跨平台一致性**:一套代码适配所有支持平台 - **低代码实现**:通过简洁API快速集成复杂手势 - ...

gitblog_00182的博客 421

Tap手势

http://www.189works.com/article-66896-1.html

黑菜妞妞的专栏 876

给菜鸟写的tapGesture和返回按钮写法的示例

菜鸟真的很菜,还不爱学习,不怕神一样的对手,只怕不爱学习的菜鸟。 [code="java"]- (void)viewDidLoad { [super viewDidLoad]; UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; UIImage *returnBtnImage ...

Coding 335

iOS开发中六种手势UITapGestureRecogniz

iOS开发中六种手势UITapGestureRecognizer iOS开发中手势识别有六种 1轻击手势TapGestureRecognizer 2长按手势LongPressGesRecognizer 3轻扫手势SwipeGestureRecognizer 4捏合手势PinchGestureRecognizer 5拖动手势PanGestureRecognizer 6旋转手势RotationGestu

DDCXYZL的博客 808
上一篇: 你真的会用Serilog吗?ASP.NET Core结构化日志配置全攻略
下一篇: 【C#高级编程技巧】:命名参数如何让代码清晰度提升80%
VarIsle
博客等级 码龄1年 155粉丝 1976原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值