在联系应用程序中搜索了几个小时之后,我就知道了它是如何工作的。
ABNewPersonViewControlle调用ToneLibrary框架中的某个类来执行此操作。
调用堆栈如下所示:
0 CoreFoundation 0x3359a1d4 CFGetTypeID + 0
1 CoreFoundation 0x33596396 __CFPropertyListIsValidAux + 46
2 CoreFoundation 0x33517090 CFPropertyListCreateData + 124
3 AudioToolbox 0x38ac255a AudioServicesPlaySystemSoundWithVibration + 158
5 ToneLibrary 0x35a7811a -[TLVibrationRecorderView vibrationComponentDidStartForVibrationRecorderTouchSurface:] + 38
6 ToneLibrary 0x35a772b2 -[TLVibrationRecorderTouchSurface touchesBegan:withEvent:] + 342
7 UIKit 0x3610f526 -[UIWindow _sendTouchesForEvent:] + 314
8 UIKit 0x360fc804 -[UIApplication sendEvent:] + 376
在网上搜索“ AudioServicesPlaySystemSoundWithVibration”后,我什么也没找到。
因此,我决定亲自调查一下。它是AudioToolbox框架中的私有功能。
函数的声明就像
void AudioServicesPlaySystemSoundWithVibration(SystemSoundID inSystemSoundID,id arg,NSDictionary* vibratePattern)
“ inSystemSoundID”是SystemSoundID,就像“ AudioServicesPlaySystemSound”一样,传递“ kSystemSoundID_Vibrate”。
“ arg”并不重要,将nil传递给它,一切仍然可以正常工作。
“ vibratePattern”是“ NSDictionary”的指针,Contact App传递为{Intensity = 1; OffDuration = 1; OnDuration = 10; }记录用户输入。
但是仅调用此函数将使振动永不停止。所以我必须找到一些功能来停止它。
答案是“ AudioServicesStopSystemSound”。它也是AudioToolbox框架中的私有功能。
函数的声明就像
void AudioServicesStopSystemSound(SystemSoundID inSystemSoundID)
我想Contact App在touchesBegan方法中使用AudioServicesPlaySystemSoundWithVibration,在touchEnd方法中使用AudioServicesStopSystemSound达到此效果。
TLVibrationController将管理振动模式对象以记录您输入的过程。
最后,它生成一个字典以传递到AudioServicesPlaySystemSoundWithVibration以重播整个过程,如下所示:
NSMutableDictionary* dict = [NSMutableDictionary dictionary];
NSMutableArray* arr = [NSMutableArray array ];
[arr addObject:[NSNumber numberWithBool:YES]];
[arr addObject:[NSNumber numberWithInt:2000]];
[arr addObject:[NSNumber numberWithBool:NO]];
[arr addObject:[NSNumber numberWithInt:1000]];
[arr addObject:[NSNumber numberWithBool:YES]];
[arr addObject:[NSNumber numberWithInt:1000]];
[arr addObject:[NSNumber numberWithBool:NO]];
[arr addObject:[NSNumber numberWithInt:500]];
[dict setObject:arr forKey:@"VibePattern"];
[dict setObject:[NSNumber numberWithInt:1] forKey:@"Intensity"];
AudioServicesPlaySystemSoundWithVibration(4095,nil,dict);
因此,如果您想在iOS中自定义振动。使用AudioServicesPlaySystemSoundWithVibration和AudioServicesStopSystemSound。