使用 CPBPressureTouch GestureRecognizer 检测敲击压力强度

2023-11-29

它与一个 UIButton 配合得很好:

 – (void) viewDidLoad {
[super viewDidLoad];

CPBPressureTouchGestureRecognizer* recognizer = [[CPBPressureTouchGestureRecognizer alloc] initWithTarget:self action:@selector(A_button:)];
[A_button addGestureRecognizer: recognizer];
[recognizer release];
}


- (void) A_button: (CPBPressureTouchGestureRecognizer*) recognizer {
[pan_A setGain:recognizer.pressure];
[pan_A] play;
}

我尝试使用更多,但只有第二个有效:

- (void) viewDidLoad {
[super viewDidLoad];
CPBPressureTouchGestureRecognizer* recognizer1 = [[CPBPressureTouchGestureRecognizer alloc] initWithTarget:self action:@selector(A_button:)];
[A_button addGestureRecognizer: recognizer1];

CPBPressureTouchGestureRecognizer* recognizer2 = [[CPBPressureTouchGestureRecognizer alloc] initWithTarget:self action:@selector(B_button:)];
[B_button addGestureRecognizer: recognizer1];
[recognizer1 release];
[recognizer2 release];
}

- (void) A_button: (CPBPressureTouchGestureRecognizer*) recognizer1 {
[pan_A setGain:recognizer1.pressure];
[pan_A] play;
}

- (void) B_button: (CPBPressureTouchGestureRecognizer*) recognizer1 {
[pan_B setGain:recognizer2.pressure];
[pan_B] play;
}

我怎样才能让两者都工作?


CPBPressureTouchGestureRecognizer 仅支持对 UIAccelerometer 的委托模型执行的单个实例。这是一个更好的版本,支持多个实例。

//  CPBPressureTouchGestureRecognizer.h
//  PressureSensitiveButton

#import <UIKit/UIKit.h>

#define CPBPressureNone         0.0f
#define CPBPressureLight        0.3f
#define CPBPressureMedium       0.4f
#define CPBPressureHard         0.6f
#define CPBPressureInfinite     2.0f

@interface CPBPressureTouchGestureRecognizer : UIGestureRecognizer {
    @public
    float pressure;
    float minimumPressureRequired;
    float maximumPressureRequired;

    @private
    float pressureValues[50];
    uint currentPressureValueIndex;
    uint setNextPressureValue;
}

@property (readonly, assign) float pressure;
@property (readwrite, assign) float minimumPressureRequired;
@property (readwrite, assign) float maximumPressureRequired;

@end

//  CPBPressureTouchGestureRecognizer.m

#import <UIKit/UIGestureRecognizerSubclass.h>
#import "CPBPressureTouchGestureRecognizer.h"
#import "CPBAcceleromterDelegate.h"

#define kUpdateFrequency            60.0f
#define KNumberOfPressureSamples    3

@interface CPBPressureTouchGestureRecognizer (private)
    - (void)setup;
@end

@implementation CPBPressureTouchGestureRecognizer
@synthesize pressure, minimumPressureRequired, maximumPressureRequired;

- (id)initWithTarget:(id)target action:(SEL)action {
    self = [super initWithTarget:target action:action];
    if (self != nil) {
       [self setup];
    }
    return self;
}

- (id)init {
    self = [super init];
    if (self != nil) {
        [self setup];
    }
    return self;
}

- (void)dealloc {
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    [super dealloc];
}

- (void)setup {
    minimumPressureRequired = CPBPressureNone;
    maximumPressureRequired = CPBPressureInfinite;
    pressure = CPBPressureNone;

    [[UIAccelerometer sharedAccelerometer] setUpdateInterval:0.001f / kUpdateFrequency];
    [[UIAccelerometer sharedAccelerometer] setDelegate:[CPBAcceleromterDelegate sharedCPBAcceleromterDelegate]];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(accelerateNotification:) name:CPB_ACCELERATION_EVENT object:nil];
}

#pragma -
#pragma UIAccelerometerDelegate methods

- (void)accelerateNotification:(NSNotification *)notification {

    UIAcceleration *acceleration = [[CPBAcceleromterDelegate sharedCPBAcceleromterDelegate] acceleration];

    int sz = (sizeof pressureValues) / (sizeof pressureValues[0]);

    // set current pressure value
    pressureValues[currentPressureValueIndex%sz] = acceleration.z;

    if (setNextPressureValue > 0) {

        // calculate average pressure
        float total = 0.0f;
        for (int loop=0; loop<sz; loop++) total += pressureValues[loop]; 
        float average = total / sz;

        // start with most recent past pressure sample
        if (setNextPressureValue == KNumberOfPressureSamples) {
            float mostRecent = pressureValues[(currentPressureValueIndex-1)%sz];
            pressure = fabsf(average - mostRecent);
        }

        // caluculate pressure as difference between average and current acceleration
        float diff = fabsf(average - acceleration.z);
        if (pressure < diff) pressure = diff;
        setNextPressureValue--;

        if (setNextPressureValue == 0) {
            if (pressure >= minimumPressureRequired && pressure <= maximumPressureRequired)
                self.state = UIGestureRecognizerStateRecognized;
            else
                self.state = UIGestureRecognizerStateFailed;
        }
    }

    currentPressureValueIndex++;
}

#pragma -
#pragma UIGestureRecognizer subclass methods

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    setNextPressureValue = KNumberOfPressureSamples;
    self.state = UIGestureRecognizerStatePossible;
}

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event {
    self.state = UIGestureRecognizerStateFailed;
}

- (void)reset {
    pressure = CPBPressureNone;
    setNextPressureValue = 0;
    currentPressureValueIndex = 0;
}

@end


//
//  CPBAcceleromterDelegate.h
//  iPan
//
//  Created by Anthony Picciano on 1/25/12.
//  Copyright (c) 2012 Crispin Porter + Bogusky. All rights reserved.
//

#import <Foundation/Foundation.h>
#define CPB_ACCELERATION_EVENT @"accellerationEvent"

@interface CPBAcceleromterDelegate : NSObject <UIAccelerometerDelegate>

@property (nonatomic, retain) UIAcceleration *acceleration;

+ (CPBAcceleromterDelegate *)sharedCPBAcceleromterDelegate;

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration;

@end


//
//  CPBAcceleromterDelegate.m
//  iPan
//
//  Created by Anthony Picciano on 1/25/12.
//  Copyright (c) 2012 Crispin Porter + Bogusky. All rights reserved.
//

#import "CPBAcceleromterDelegate.h"
#include "SynthesizeSingleton.h"

@implementation CPBAcceleromterDelegate
@synthesize acceleration;

SYNTHESIZE_SINGLETON_FOR_CLASS(CPBAcceleromterDelegate)

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)newAcceleration
{
    self.acceleration = newAcceleration;
    [[NSNotificationCenter defaultCenter] postNotificationName:CPB_ACCELERATION_EVENT object:self];
}

@end


//
//  SynthesizeSingleton.h
//  CocoaWithLove
//
//  Created by Matt Gallagher on 20/10/08.
//  Copyright 2009 Matt Gallagher. All rights reserved.
//  http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html
//
//  Permission is given to use this source code file without charge in any
//  project, commercial or otherwise, entirely at your risk, with the condition
//  that any redistribution (in part or whole) of source code must retain
//  this copyright and permission notice. Attribution in compiled projects is
//  appreciated but not required.
//

#define SYNTHESIZE_SINGLETON_FOR_CLASS(classname) \
\
static classname *shared##classname = nil; \
\
+ (classname *)shared##classname \
{ \
@synchronized(self) \
{ \
if (shared##classname == nil) \
{ \
shared##classname = [[self alloc] init]; \
} \
} \
\
return shared##classname; \
} \
\
+ (id)allocWithZone:(NSZone *)zone \
{ \
@synchronized(self) \
{ \
if (shared##classname == nil) \
{ \
shared##classname = [super allocWithZone:zone]; \
return shared##classname; \
} \
} \
\
return nil; \
} \
\
- (id)copyWithZone:(NSZone *)zone \
{ \
return self; \
} \
\
- (id)retain \
{ \
return self; \
} \
\
- (NSUInteger)retainCount \
{ \
return NSUIntegerMax; \
} \
\
- (void)release \
{ \
} \
\
- (id)autorelease \
{ \
return self; \
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 CPBPressureTouch GestureRecognizer 检测敲击压力强度 的相关文章

  • 如何在 iOS 中使用 Dropbox API 用父版本覆盖文件?

    我正在使用 Dropbox API 开发 iOS 应用程序 使用 dropbox API 上传文件时 我只想覆盖同名的现有文件 如何设置父转速以及什么值 谢谢 获取目录中的所有文件 self restclient loadMetadata
  • 如何通过 CollectionView 中的流布局将单元格对齐到顶部

    在此代码中 我尝试更改 UICollectionView 的第一个单元格的大小以及具有相同大小的其他单元格的大小 但在第一行中 当我想要两个单元格出现时 只有一个单元格出现 func collectionView collectionVie
  • 如何在核心数据中应用group by子句

    我正在实现 tableview 我想在 tableview 部分显示类名 并且我正在尝试获取 使用核心数据实现的数据库中的类值 我想使用类名上的 group by 子句获取数据 这是我的代码 AppDelegate appDelegate
  • iOS UITest:如何找到UITableViewCell的AccessoryView?

    你好我正在学习UITests now 我有个问题 如何检测accessoryView的点击tableViewCell 在UI测试中 下面是我的tableViewCell 我想要检测细节闭合配件视图水龙头 像这样 app tables cel
  • 用于开发 iPhone 推送通知服务的 Google App Engine 的 Java 替代方案是什么?

    我是一名 Java 程序员 正在开发 iPhone 应用程序 我希望它使用推送通知服务 我原本以为我可以使用 Google App Engine 向 Apple 提供有效负载 但现在我发现这是不可能的 因为 App Engine 不支持与
  • Xamarin 没有安装的配置文件与安装的 iOS 签名身份匹配

    我想知道是否可以在 ios 设备上编译 Xamarin 应用程序 使用 Visual Studio for mac 而无需成为开发人员 费用为 99 美元 年 因为当我尝试在 iPhone 上构建项目时出现此错误 Xamarin iOS C
  • 使用 GCD 异步 UITableViewCell 图像加载

    我目前正在尝试加载 Flickr 照片的 UITableView 列表 cs193p iOS 斯坦福大学 作业 5 为了避免 UI 阻塞事件 我将每个单元格的缩略图下载推迟到不同的队列中 但确实将 UI 更新回主队列中 此代码不会异步加载图
  • Parse.com 因超出突发限制而拒绝服务

    我使用 Parse 创建了一个 iOS 应用程序 其中使用的是从 Parse com 网站下载的 iOS SDK 为了创建此类应用程序 ApplicationID 和 ClientID 密钥都嵌入在 iOS 应用程序中 并在使用应用程序时从
  • 使用动画更改 UIView 背景颜色

    我想改变我的UIView带有过渡动画的背景颜色 例如 如果视图是红色的 我将其更改为蓝色 蓝色将从屏幕底部向上滑动到顶部并充满整个屏幕 我想通过制作一个来做到这一点UIView具有相同大小和所需颜色 然后将其从屏幕外一直动画到顶部 但这似乎
  • 如何在 Flutter 中为 Button 添加渐变?

    有没有办法改变ElevatedButton背景颜色渐变 如果没有一些小瑕疵或问题 例如缺少涟漪效应 不需要的边框 不尊重主题的内容 上述所有解决方案都无法真正发挥作用minWidth对于按钮 The 下面的解决方案没有上述问题 关键部分是使
  • 使用 Javascript 获取 Mobile Safari 中选定的文本

    因此 我正在开发一个小书签 对于我来说 使用 循环 获取用户选择的内容是理想的选择 window getSelection 和 document getSelection 都是我可以调用的函数 但是它们始终返回空字符串 我相信问题在于 当您
  • 我无法让 HealthKit 工作。缺失的权利

    我很难让 HealthKit 为我的 iOS 应用程序工作 我已经完成了所有步骤到目前为止我已经找到了 http jademind com blog posts healthkit api tutorial 似乎没有一个能解决我的问题 当我
  • 从 NSString 获取子字符串,直到到达特定单词

    假设我有这个NSString Country Address Tel number 我该如何获取之前的子字符串Tel 国家地址 然后我该如何获取后面的子字符串Tel 数字 使用 NSScanner NSString string Count
  • 关于 S3 文件传输的权限

    我正在使用 S3TransferManager Sample 进行测试 我创建了Cognito并设置了IAM并最后更改了constants swift文件 我上传没有问题 但下载失败 错误信息是 下载失败 错误域 com amazonaws
  • 关系上的核心数据属性?

    我刚刚开始使用核心数据 我有一个Headache实体和一个Medication实体 头痛和药物之间存在多对多的关系 当您加重头痛时 您可以选择多种药物 我希望能够指定这些药物的数量 我对 MySQL 更熟悉 您可以在其中创建一个数据透视表
  • iPhone - cancelPerformSelectorWithTarget 不起作用

    如果我在 UIView 的子类中执行此操作 self performSelector selector doSomething withObject nil afterDelay 5 然后像这样取消它 我已经尝试了两个版本 NSRunLoo
  • NativeScript:禁用 iOS WebView 缩放控件的方法?

    我正在尝试找出一种方法来防止用户通过捏合手势和双击来放大和缩小 iOS WebView tns ios 3 4 1 本质上禁用所有缩放 就像苹果之前使用的 html 元标记一样让用户决定是否要使用 iOS 10 及更高版本进行缩放 我找到了
  • CF 类型的带有 __attribute__((NSObject)) 的强 @property 不会保留

    更新 自 Xcode 4 6 起 此问题已得到修复 现在 这项技术再次按预期发挥作用 但是 在代码中使用之前 请务必阅读 Rob Napier 出色答案顶部的注释 原帖 ARC Xcode 4 3 1 iOS 5 1 我有一个 CF 类型
  • 将 Objective-C 框架 (CocoaPod) 导入 Swift?

    我正在尝试导入libjingle peerconnection框架到我的 Xcode 项目中 但由于某种原因 我无法使用以下命令导入 Objective C 标头import RTCICEServer在 Swift 源文件中 我尝试使用头文
  • 使用 Core Data Swift 对 TableView 和行进行分区

    我在 sqlite 中有两个表 代码由 XCode Generation 生成 class Event NSManagedObject NSManaged var startDate NSDate NSManaged var details

随机推荐

  • 是否可以使用 CSS 在 VML 路径上设置填充和描边颜色以及不透明度?

    例如 我想做如下的事情 myRedPath fillcolor red
  • JTextField 自动完成错误

    In 这个线程 我找到了一种实现方法AutoComplete特征在一个JTextField and JComboBox 但这没有问题 当尝试在中实现此功能时JTextField它会抛出一些异常 以下代码将演示该问题 很简单 和我用的方式很相
  • 使用 JavaScript Regex 进行条件渲染

    我需要匹配这样的字符串 if Country equals United States then Show 我正在使用 Sitecore 中的营销人员网络表单模块 Sitecore 是一个基于 NET 的 CMS 营销人员模块的 Webfo
  • 如何启用和禁用javascript功能?

    if tmpStr tmp value i 1 action null action2 null if tmpStr1 tmp value i 0 action not working action2 not working fo
  • 令牌必须是短期令牌并且在合理的时间范围内

    我有同样的错误this 就我而言 当应用程序尝试通过 Google Cloud 客户端 API 上传文件时 就会发生这种情况 POST https www googleapis com oauth2 v4 token 400 Bad Req
  • 即使没有值存在,SQL 查询也能返回 24 小时、每小时计数吗?

    我编写了一个查询 根据给定的日期范围对每小时的行数进行分组 SELECT CONVERT VARCHAR 8 TransactionTime 101 CONVERT VARCHAR 2 TransactionTime 108 as TDat
  • XSendfile 不工作 - PHP、Apache、Cpanel

    强烈建议我使用 XSendfile 因为我们从服务器提供相当大的文件 服务器正在运行 Cpanel 以前我们使用直接强制下载脚本 该脚本在某些浏览器中也不能很好地工作 希望用XSendfile一石二鸟 好的 我们的主机已在我们的服务器上启用
  • 具有循环功能的 PHP HTML 模板

    我想请求一些有关如何在模板内实现循环的帮助和想法 我可以在下面进行 foearch 但如何将其包含到模板中并在结果中显示它 foreach results as row name row name address row address 我
  • GCM 注册 ID 为空

    您好 我正在尝试实施 GCM 推送通知 我得到一个空的 GCM ID 这是我的代码 public void registerClient try Check that the device supports GCM should be in
  • Python:2D 图像的 3D 轮廓 - pylab 和contourf

    我有一个关于 Python pylab 和绘图的问题 我能够加载并显示图像 下面的代码加载下面的图像 但我无法将其绘制为 3D 轮廓 我知道需要一个数组pylab contourf x y z 虽然我不确定如何从加载的图像数据中实现这一点
  • 使用VBA从列表中重命名多个工作表

    我是 VBA 新手 正在尝试从列表中命名工作表 我有一个包含 133 个工作表的文件 并且想要从其中一个工作表的列表中命名每个工作表 单元格 B1 到 B133 具有所需名称的列表 单元格 c1 到 c133 具有工作表名称 Sheet1
  • 如何让 sed 并排输出?

    我想要并排放置的基因 KEGG 通路的标准输出 无论它有多少行 KEGG 通路 例如 基因 TT123456 涉及多个途径 Valine leucine and isoleucine degradation Histidine metabo
  • 停止执行 Javascript 函数(客户端)或对其进行调整

    我想停止执行站点中的一行 以便浏览器读取除该行之外的整个页面 或者浏览器可能会简单地跳过该 JavaScript 函数的执行 OR 有没有办法我可以以某种方式调整javascript 以便javascript中的随机数生成函数不生成随机数
  • Netbeans 如何在 Java 中设置命令行参数

    我正在尝试在 Windows 7 64 位上的 Netbeans 7 1 Java 项目中设置命令行参数 Netbeans 没有传递我给出的参数 I go to Project gt Properties gt Run gt 并在 参数 旁
  • 添加链接时 Facebook 如何检测图像?

    当您向 Facebook 页面添加链接时 经过一些处理后 Facebook 会向您显示一个下一个 上一个按钮 以选择链接到您要插入的网址的图像 显然 Facebook 会读取 html 页面并显示在您插入的 url 上找到的图像 有谁知道
  • 用于动态创建输入的 jQuery 自动完成

    我在使用 jQuery 自动完成功能和动态创建的输入 再次使用 jQuery 创建 时遇到问题 我无法将自动完成功能绑定到新输入 自动完成 description autocomplete source function request r
  • 有没有办法在应用程序设置中使用字典或 xml?

    我必须在应用程序设置中存储复杂类型 我认为将其存储为 XML 效果最好 问题是我不知道如何存储 XML 我更喜欢将其存储为托管 XML 而不是仅使用必须在每次访问时解析它的原始 XML 字符串 我设法设置了Type设置为 XDocument
  • 如何通过 Google Play 商店链接到 Android 应用程序

    我有一个免费版本的应用程序 我想通过单击应用程序上的购买按钮来链接应用程序商店 我该怎么做 我完全不知道 请帮助我编写一些代码 提前致谢 我所做的是 public void onCreate Bundle savedInstanceStat
  • Swift didSet 获取数组的索引

    假设我有一个数组 var intArray Int 1 2 3 4 5 didSet print index of value that was modified if I do intArray 2 10 里面可以写什么didSet为了打
  • 使用 CPBPressureTouch GestureRecognizer 检测敲击压力强度

    它与一个 UIButton 配合得很好 void viewDidLoad super viewDidLoad CPBPressureTouchGestureRecognizer recognizer CPBPressureTouchGest