本文實例為大家分享了iOS仿AirPods彈出動畫的具體代碼,供大家參考,具體內容如下
效果圖

預覽圖
思路
在當前ViewController下Present另外一個AnimationViewController,在彈出的AnimationViewController中播放動畫,彈出的時候原來的ViewController上有一個全屏覆蓋的maskView,在彈出時,有一個漸變動畫(頁面漸黑),在AnimationViewController聲明一個代理,在代理方法中實現收起的動畫效果(dissmissController和maskView消失)
主要代碼
HCAirPodsAnimationViewController *vc = [[HCAirPodsAnimationViewController alloc] init];  vc.delegate = self;  vc.modalPresentationStyle = UIModalPresentationOverCurrentContext;    [UIView animateWithDuration:0.2 animations:^{    self.maskBgView.alpha = 0.5;  } completion:nil];    [self presentViewController:vc animated:YES completion:^{    [vc.animationView play];  }];模態跳轉的style有一個枚舉值,在iOS13以前modalPresentationStyle的默認值為UIModalPresentationFullScreen,iOS13以后變成了UIModalPresentationPageSheet,在這里我們把style設置為UIModalPresentationOverCurrentContext彈出的這個控制器就會覆蓋在原來的控制器之上
- (UIView *)maskBgView{  if (!_maskBgView) {    _maskBgView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height)];    _maskBgView.backgroundColor = [UIColor blackColor];    _maskBgView.alpha = 0;    [self.view addSubview:_maskBgView];  }  return _maskBgView;}一個覆蓋全屏的maskView采用懶加載的方式實現
- (void)initContentView{  CGFloat containerW = SCREEN_WIDTH - 20;  CGFloat containerH = containerW * 0.9;  UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(10, SCREEN_HEIGHT - containerH - 10, containerW, containerH)];  containerView.layer.cornerRadius = 20;  containerView.backgroundColor = [UIColor whiteColor];  [self.view addSubview:containerView];    self.animationView = [[LOTAnimationView alloc] initWithFrame:CGRectMake(70, 70, containerW - 140, containerH - 140)];  [containerView addSubview:self.animationView];  self.animationView.animation = @"gift_animation";    self.animationView.loopAnimation = YES;    UIButton *confirmButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 200, 34)];  confirmButton.center = CGPointMake(self.animationView.center.x, containerH - 44);    [confirmButton setTitle:@"Close" forState:UIControlStateNormal];  [confirmButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];    [confirmButton setBackgroundColor:[UIColor blueColor]];  confirmButton.layer.cornerRadius = 10;    [confirmButton addTarget:self action:@selector(onConfirmButtonClick) forControlEvents:UIControlEventTouchUpInside];  [containerView addSubview:confirmButton];}動畫這里用到的是Lottie這個動畫開源庫(Airbnb),這個開源庫主要的功能是可以將After Effects制作的動畫通過插件導出為json格式的文件,然后通過這個開源庫解析成動畫。
- (void)onConfirmButtonClick{  if ([self.delegate respondsToSelector:@selector(onAirPodsAnimationViewControllerConfirmButtonClick:)]) {    [self dismissViewControllerAnimated:YES completion:nil];    [self.delegate onAirPodsAnimationViewControllerConfirmButtonClick:self];  }}dissmiss當前的控制器,讓viewController來實現這個代理方法,并且在代理方法中隱藏maskView
- (void)onAirPodsAnimationViewControllerConfirmButtonClick:(HCAirPodsAnimationViewController *)vc{  [UIView animateWithDuration:0.2 animations:^{    self.maskBgView.alpha = 0.0;  } completion:nil];}項目地址:AirPodsAnimation
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答