视图的形变
tgr.view.transform = CGAffineTransformIdentity;//形变清零
单击手势必须再双击手势识别失败时才识别
//否则一次双击可以同时出发多个手势
[singleTap requireGestureRecognizerToFail:doubleTap];
1.点击手势
UITapGestureRecognizer
//设置点击次数,默认为1
tgr.numberOfTapsRequired = 2;
//设置触摸点数,默认为1
//tgr.numberOfTouchesRequired = 2;
2.长按手势UILongPressGestureRecognizer
//设置最小持续时间
lpgr.minimumPressDuration = 1;
3.滑动手势UIPanGestureRecognizer
注:view上label的移动操作
- (void)panGestureHandle:(UIPanGestureRecognizer *)pgr
{
switch (pgr.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStateChanged:
//NSLog(@"滑动手势识别成功");
{
UIView *view = pgr.view;
CGPoint offset = [pgr translationInView:self.view];
//用形变量改变位置,在上一次形变量基础之上
view.transform = CGAffineTransformTranslate(view.transform, offset.x, offset.y);
**//因为滑动手势效果会累加,所以每次需要清零
[pgr setTranslation:CGPointZero inView:self.view];**
}
break;
case UIGestureRecognizerStateEnded:
NSLog(@"滑动手势识别结束");
break;
default:
break;
}
}
4.捏合手势UIPinchGestureRecognizer
-(void)pinchGestureHandle:(UIPinchGestureRecognizer *)pgr
{
switch (pgr.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStateChanged:
{
UIView *view = pgr.view;
view.transform = CGAffineTransformScale(view.transform, pgr.scale, pgr.scale);
//缩放比例会累加,所以需要重新复位
pgr.scale = 1;
}
break;
case UIGestureRecognizerStateEnded:
NSLog(@"捏合手势结束");
break;
default:
break;
}
}
5.旋转手势UIRotationGestureRecognizer
pragma mark - 旋转手势
- (void)rotationGestureHandle:(UIRotationGestureRecognizer *)rgr
{
switch (rgr.state) {
case UIGestureRecognizerStateBegan:
case UIGestureRecognizerStateChanged:
{
UIView *view = rgr.view;
view.transform = CGAffineTransformRotate(view.transform, rgr.rotation);
//因为旋转弧度会累加,所以需要清零
rgr.rotation = 0;
}
break;
case UIGestureRecognizerStateEnded:
NSLog(@"旋转结束");
break;
default:
break;
}
}
//设置代理,出现手势冲突时可以加以干涉
rgr.delegate = self;
pragma mark - 代理方法
//注:此代理方法解决手势冲突
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
//如果多个手势操作一个视图,返回yes识别
if (gestureRecognizer.view == otherGestureRecognizer.view) {
return YES;
}
return NO;
}
6.有方向滑动UISwipeGestureRecognizer
//触动方法
注:下面代码实现单方向快速滑过,view上label朝划过的方向移动一定距离,需要设置sgr.direction
- (void)swipeGestureHandle:(UISwipeGestureRecognizer *)sgr
{
#define MOVE_STEP 100
UIView *view = sgr.view;
CGPoint offset = CGPointZero;
switch (sgr.direction) {
case UISwipeGestureRecognizerDirectionDown:
offset.y += MOVE_STEP;
break;
case UISwipeGestureRecognizerDirectionUp:
offset.y -= MOVE_STEP;
break;
case UISwipeGestureRecognizerDirectionLeft:
offset.x -= MOVE_STEP;
break;
case UISwipeGestureRecognizerDirectionRight:
offset.x += MOVE_STEP;
break;
default:
break;
}
view.transform = CGAffineTransformTranslate(view.transform, offset.x, offset.y);
}
7.摇晃事件
说明:实现类似微信摇一摇功能,声音、动画 并未实现代理方法,使用晃动事件接口监听晃动事件
注:播放短音乐,需导入AudioToolbox.framework系统包,导入#import
(AudioToolbox/AudioToolbox.h)
- (void)playSoundWithName:(NSString *)soundName
{
NSArray *array = [soundName componentsSeparatedByString:@"."];
NSString *path = [[NSBundle mainBundle] pathForResource:array[0] ofType:array[1]];
NSURL *url = [NSURL URLWithString:path];
SystemSoundID soundID;
AudioServicesCreateSystemSoundID((CFURLRef)url, &soundID);
AudioServicesPlayAlertSound(soundID);
}
#pragma mark - 晃动事件接口
//晃动开始
- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
[super motionBegan:motion withEvent:event];
//NSLog(@"晃动开始");
//添加动画
[self createAnimation];
//添加音乐
[self playSoundWithName:@"shake_sound_male.wav"];
}
//晃动结束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"晃动结束");
}
//滑动被取消
- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event
{
NSLog(@"滑动被取消");
}