iOS-仿抖音摇一摇,并在view中实现控制器的跳转

本文仿抖音实现摇一摇功能,可触发震动并通过点击跳转到下一界面 。

本文采用的宏定义

#define kwidth [UIScreen mainScreen].bounds.size.width
#define kheight [UIScreen mainScreen].bounds.size.height
#define ktopHeight [UIApplication sharedApplication].statusBarFrame.size.height

1、摇一摇调用

(1)摇一摇检测

使用以下代理方法,晃动手机即可调用,但是无法实现震动

//检测到开始摇动

- (void)motionBegan:(UIEventSubtype)motion withEvent:(UIEvent *)event

//摇一摇被取消或中断

- (void)motionCancelled:(UIEventSubtype)motion withEvent:(UIEvent *)event

//摇动结束

- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event

(2)添加震动效果

导入:#import <AudioToolbox/AudioToolbox.h>

在需要出发震动的地方写上代码:
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//默认震动效果

如果想要其他震动效果,可参考:
// 普通短震,3D Touch 中 Pop 震动反馈
AudioServicesPlaySystemSound(1520);

// 普通短震,3D Touch 中 Peek 震动反馈
AudioServicesPlaySystemSound(1519);

// 连续三次短震
AudioServicesPlaySystemSound(1521);

本文中使用的是AudioServicesPlaySystemSound(1521);

2、动画

添加摇一摇视图,使用的是CABasicAnimation

- (void)addShakeView {
    if (_shakeView.isShow) {
        return;
    } else {
        _shakeView = [[ZWShakeView alloc] initWithFrame:CGRectMake(15, ktopHeight, kwidth - 30, 80)];
        _shakeView.backgroundColor = [UIColor whiteColor];
        _shakeView.layer.cornerRadius = 10;
        self.shakeView.isShow = YES;
        
        CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"position"];
        animation.duration = 0.5;
        animation.repeatCount = 1;
        animation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseOut];
        animation.fromValue = [NSValue valueWithCGPoint:CGPointMake(kwidth / 2, -40)];
        animation.toValue = [NSValue valueWithCGPoint:CGPointMake(kwidth / 2, ktopHeight + 40)];
        [_shakeView.layer addAnimation:animation forKey:@"moveIn"];
        
        [self.view addSubview:_shakeView];
    }
}

等到摇动结束调用

//摇动结束
- (void)motionEnded:(UIEventSubtype)motion withEvent:(UIEvent *)event {
//    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);//默认震动效果
//    普通短震,3D Touch 中 Pop 震动反馈
//    AudioServicesPlaySystemSound(1520);
//    普通短震,3D Touch 中 Peek 震动反馈
//    AudioServicesPlaySystemSound(1519);
    AudioServicesPlaySystemSound(1521);
    NSLog(@"摇动结束");
    
    /*采用延时执行而不使用以下的方式,因为加上动画后会导致按钮无法点击,所以在一定时间后再加上动画
     [UIView animateWithDuration:0.5 delay:3 options:UIViewAnimationOptionCurveEaseOut animations:^{
             self.shakeView.frame = CGRectMake(15, -80, kwidth - 30, 80);
         } completion:^(BOOL finished) {
             [self.shakeView removeFromSuperview];
         }];
     */
    [self performSelector:@selector(moveShakeView) withObject:nil afterDelay:3];
}

- (void)moveShakeView {
    [UIView animateWithDuration:0.5 animations:^{
        self.shakeView.frame = CGRectMake(15, -80, kwidth - 30, 80);
    } completion:^(BOOL finished) {
        [self.shakeView removeFromSuperview];
        self.shakeView.isShow = NO;
    }];
}

3、navbar的隐藏

在首页需要隐藏navbar,否则会遮盖住摇一摇的视图导致无法点击,为了防止进入新页面返回后navbar重新出现,在本界面出现后隐藏navbar。如有需要,在新界面开启navbar。

-(void)viewWillAppear:(BOOL)animated {
    self.navigationController.navigationBar.hidden = YES;//防止navigationBar遮住摇一摇的视图
//    [_shakeView removeFromSuperview];
}

4、在View中实现控制器的跳转

/// 获取Nav
- (UINavigationController *)getNavigationController {
    UIWindow *window = [UIApplication sharedApplication].keyWindow;
    if ([window.rootViewController isKindOfClass:[UINavigationController class]]) {
        return (UINavigationController *)window.rootViewController;
    } else if ([window.rootViewController isKindOfClass:[UITabBarController class]]) {
        UIViewController *selectedVC = [((UITabBarController *)window.rootViewController)selectedViewController];
        if ([selectedVC isKindOfClass:[UINavigationController class]]) {
            return (UINavigationController *)selectedVC;
        }
    }
    return nil;
}

详细代码ZWAnimationShake,此功能为自己研究,如有更好的方法可一起讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值