iOS中关于Taptic-Engine震动反馈的深入解析

2020-01-21 02:14:00丽君


- (IBAction)gestureHandler:(UIPanGestureRecognizer *)sender {
 
 switch (sender.state) {
  case UIGestureRecognizerStateBegan:
   
   // Instantiate a new generator.
   self.feedbackGenerator = [[UISelectionFeedbackGenerator alloc] init];
   
   // Prepare the generator when the gesture begins.
   [self.feedbackGenerator prepare];
   
   break;
   
  case UIGestureRecognizerStateChanged:
   
   // Check to see if the selection has changed...
   if ([self myCustomHasSelectionChangedMethodWithTranslation:[sender translationInView: self.view]]) {
    
    // Trigger selection feedback.
    [self.feedbackGenerator selectionChanged];
    
    // Keep the generator in a prepared state.
    [self.feedbackGenerator prepare];
 
   }
   
   break;
   
  case UIGestureRecognizerStateCancelled:
  case UIGestureRecognizerStateEnded:
  case UIGestureRecognizerStateFailed:
   
   // Release the current generator.
   self.feedbackGenerator = nil;
   
   break;
   
  default:
   
   // Do nothing.
   break;
 }
}

三种方法在测试机上不同的反馈结果

 

AudioServicesPlaySystemSound 1519 1520 1521
iPhone 7(iOS 10) peek 触感 pop 触感 三次连续短振
iPhone 6s Puls(iOS 9) peek 触感 pop 触感 三次连续短振
iPhone 6(iOS 10) 无振动 无振动 无振动

 

获取 _tapticEngine 

 

iPhone 7(iOS 10) 无振动
iPhone 6s Puls(iOS 9) 长振
iPhone 6(iOS 10) 无振动

 

 

UIImpactFeedbackGenerator .Light .Medium .Heavy
iPhone 7(iOS 10) 微弱短振 中等短振 明显短振
iPhone 6s Puls(iOS 9) 长振 长振 长振
iPhone 6(iOS 10) 无振动 无振动 无振动

 

总结一下,希望同样的代码能在更多的机型上实现短振,建议使用 AudioServicesPlaySystemSound(1519)。不过可能会涉及到调用私有 API。安全起见,可以使用 UIImpactFeedbackGenerator。

代码

测试代码在这里。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对ASPKU的支持。