我这样做的方法是使用我提供的DFContinuousForceTouchGestureRecognizer。这是一个手势识别器扩展,可检测强制触摸并与其他手势识别器一起工作。
DFContinuousForceTouchGestureRecognizer 提供有关压力变化的持续更新,因此您可以做一些很好的事情,例如在用户改变压力时增加视图,而不是仅仅触发单个事件。如果您只想要一个事件,您可以忽略 DFContinuousForceTouchDelegate 中的所有内容,除了 - (void) forceTouchRecognized 回调。
https://github.com/foggzilla/DFContinuousForceTouchGestureRecognizer
您可以下载这个并在支持力压的设备上运行示例应用程序,看看感觉如何。
在你的 UIViewController 实现中:
- (void) viewDidLoad {
[super viewDidLoad];
_forceTouchRecognizer = [[DFContinuousForceTouchGestureRecognizer alloc] init];
_forceTouchRecognizer.forceTouchDelegate = self;
[self.imageView addGestureRecognizer:_forceTouchRecognizer];
}
实现强制触摸的委托协议:
#pragma DFContinuousForceTouchDelegate
- (void) forceTouchRecognized:(DFContinuousForceTouchGestureRecognizer*)recognizer {
self.imageView.transform = CGAffineTransformIdentity;
[self.imageView setNeedsDisplay];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[[[UIAlertView alloc] initWithTitle:@"Force Touch" message:@"YEAH!!" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil] show];
});
}
- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didStartWithForce:(CGFloat)force maxForce:(CGFloat)maxForce {
CGFloat transformDelta = 1.0f + ((force/maxForce) / 3.0f);
self.imageView.transform = CGAffineTransformMakeScale(transformDelta, transformDelta);
[self.imageView setNeedsDisplay];
}
- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didMoveWithForce:(CGFloat)force maxForce:(CGFloat)maxForce {
CGFloat transformDelta = 1.0f + ((force/maxForce) / 3.0f);
self.imageView.transform = CGAffineTransformMakeScale(transformDelta, transformDelta);
[self.imageView setNeedsDisplay];
}
- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didCancelWithForce:(CGFloat)force maxForce:(CGFloat)maxForce {
self.imageView.transform = CGAffineTransformIdentity;
[self.imageView setNeedsDisplay];
}
- (void) forceTouchRecognizer:(DFContinuousForceTouchGestureRecognizer*)recognizer didEndWithForce:(CGFloat)force maxForce:(CGFloat)maxForce {
self.imageView.transform = CGAffineTransformIdentity;
[self.imageView setNeedsDisplay];
}
- (void) forceTouchDidTimeout:(DFContinuousForceTouchGestureRecognizer*)recognizer {
self.imageView.transform = CGAffineTransformIdentity;
[self.imageView setNeedsDisplay];
}
请注意,这仅在支持强制触摸的设备上有用。
此外,如果您在 iOS8 或更低版本上运行,则不应将 UIContinuousForceTouchGestureRecognizer 添加到视图中,因为它使用 UITouch 上的新 force 属性,仅在 iOS9 中可用。
如果你在 iOS8 上添加它会崩溃,所以如果你支持 iOS9 之前的版本,请根据你运行的 iOS 版本有条件地添加这个识别器。