本文实例为大家分享了iOS为导航栏添加播放动画的具体代码,供大家参考,具体内容如下

FLAudioVisualizerView.h

#import <UIKit/UIKit.h>

@interface FLAudioVisualizerView : UIView

#pragma mark -

// 默认UIEdgeInsetsZero
@property (nonatomic, assign) UIEdgeInsets contentInsets;
// 默认为4
@property (nonatomic, assign) NSInteger barCount;
@property (nonatomic, copy) NSArray<NSNumber *> *barHeightRateList;
// 默认白色
@property (nonatomic, copy) UIColor *barColor;
// 默认2
@property (nonatomic, assign) CGFloat cornerRadius;
// 默认5
@property (nonatomic, assign) CGFloat barSpace;
// NSValue包装CGPoint
@property (nonatomic, strong) NSArray<NSValue *> *aniamteOffsetList;
@property (nonatomic, readonly) BOOL isAniamting;

- (void)restart;
- (void)start;
- (void)stop;

@end

FLAudioVisualizerView.m

#import "FLAudioVisualizerView.h"

@interface FLAudioVisualizerView ()

@property (nonatomic, strong) NSArray<UIView *> *barList;
@property (nonatomic, assign) BOOL isAniamting;

@end

@implementation FLAudioVisualizerView

#pragma mark -

- (id)initWithFrame:(CGRect)frame
{
  if (self = [super initWithFrame:frame]) {
    [self setBarCount:4];
    _barSpace = 5;
    _barColor = [UIColor whiteColor];
    self.cornerRadius = 2;
    self.barHeightRateList = @[@(0.4), @(0.75), @(0.55), @(0.95)];
    self.transform = CGAffineTransformMakeRotation(M_PI);
    self.aniamteOffsetList = @[[NSValue valueWithCGPoint:CGPointMake(0.1, 0.4)],
                  [NSValue valueWithCGPoint:CGPointMake(0.75, 0.3)],
                  [NSValue valueWithCGPoint:CGPointMake(0.2, 0.55)],
                  [NSValue valueWithCGPoint:CGPointMake(0.94, 0.4)],
                  ];
    self.contentInsets = UIEdgeInsetsZero;
  }
  return self;
}

- (void)layoutSubviews
{
  [super layoutSubviews];
  CGRect rect = self.bounds;
  if (fabs(rect.size.width) < 1e-3 || fabs(rect.size.height) < 1e-3 || rect.size.width < 0 || rect.size.height < 0 ) {
    return;
  }
  rect = CGRectWithEdgeInserts(rect, self.contentInsets);
  __block CGRect barRect = rect;
  barRect.size.width = (rect.size.width - (self.barCount - 1) * self.barSpace) / self.barCount;
  NSArray<NSNumber *> *barHeightRateList = self.barHeightRateList.reverseObjectEnumerator.allObjects;
  [self.barList enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    obj.layer.anchorPoint = CGPointZero;
    CGFloat rate = 1.0;
    if (idx < barHeightRateList.count) rate = barHeightRateList[idx].floatValue;
    barRect.size.height = rect.size.height * rate;
    obj.frame = barRect;
    barRect.origin.x  = barRect.size.width   self.barSpace;
  }];
}

#pragma mark -

static CGRect CGRectWithEdgeInserts(CGRect rect, UIEdgeInsets inserts)
{
  rect.origin.x  = inserts.left;
  rect.origin.y  = inserts.top;
  rect.size.width -= inserts.left   inserts.right;
  rect.size.height -= inserts.top   inserts.bottom;
  return rect;
}

#pragma mark -

- (void)setBarCount:(NSInteger)barCount
{
  _barCount = barCount;
  NSInteger diff = self.barList.count - barCount;
  if (diff > 0) {
    NSArray<UIView *> *removeBarViewList = [self.barList subarrayWithRange:NSMakeRange(barCount, diff)];
    [removeBarViewList makeObjectsPerformSelector:@selector(removeFromSuperview)];
    self.barList = [self.barList subarrayWithRange:NSMakeRange(0, barCount)];
  } else if (diff < 0) {
    diff = -diff;
    NSMutableArray *addBarViewList = [NSMutableArray arrayWithCapacity:diff];
    for (NSInteger index = 0; index < diff; index   ) {
      UIView *imageView = [[UIView alloc] init];
      imageView.clipsToBounds = YES;
      imageView.layer.cornerRadius = self.cornerRadius;
      [addBarViewList addObject:imageView];
      imageView.backgroundColor = [UIColor whiteColor];
    }
    if (self.barList) {
      self.barList = [self.barList arrayByAddingObjectsFromArray:addBarViewList];
    } else {
      self.barList = addBarViewList;
    }
  }
  [self.barList enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    [self addSubview:obj];
  }];
}

- (void)setCornerRadius:(CGFloat)cornerRadius
{
  _cornerRadius = cornerRadius;
  [self.barList enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    obj.layer.cornerRadius = cornerRadius;
  }];
}

- (void)setBarColor:(UIColor *)barColor
{
  [self.barList enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    obj.backgroundColor = barColor;
  }];
}

- (void)aniamteWithBar:(UIView *)bar startHeight:(CGFloat)startHeight endHeight:(CGFloat)endHeight
{
  CABasicAnimation * animation;
  animation = [CABasicAnimation animationWithKeyPath:@"bounds.size.height"];
  animation.fromValue = [NSNumber numberWithFloat:startHeight];
  animation.toValue = [NSNumber numberWithFloat:endHeight];
  animation.duration = 0.25;
  animation.repeatCount = MAXFLOAT;
  animation.autoreverses = YES;
  [bar.layer addAnimation:animation forKey:@"bounds.size.height"];
}

- (void)restart
{
  [self stop];
  [self start];
}

- (void)start
{
  if (self.isAniamting) return;
  self.isAniamting = YES;
  NSArray<NSValue *> *aniamteOffsetList = self.aniamteOffsetList.reverseObjectEnumerator.allObjects;
  [self.barList enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    if (idx < aniamteOffsetList.count) {
      CGRect rect = CGRectWithEdgeInserts(self.bounds, self.contentInsets);
      CGPoint offset = aniamteOffsetList[idx].CGPointValue;
      [self aniamteWithBar:obj startHeight:rect.size.height * offset.x endHeight:rect.size.height * offset.y];
    }
  }];
}

- (void)stop
{
  self.isAniamting = NO;
  [self.barList enumerateObjectsUsingBlock:^(UIView * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    [obj.layer removeAllAnimations];
  }];
}

@end

ViewController.m

#import "ViewController.h"
#import "FLAudioVisualizerView.h"

#define kScreen_width [UIScreen mainScreen].bounds.size.width
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height

@interface ViewController ()

@property (nonatomic, strong) FLAudioVisualizerView *visualizerView;

@end

@implementation ViewController

- (void)viewDidLoad {
  [super viewDidLoad];
  self.view.backgroundColor = [UIColor whiteColor];
  
  self.title = @"首页";
  //修改导航栏标题字体大小和颜色,背景颜色
  [self.navigationController.navigationBar setBarTintColor:[UIColor whiteColor]];
  [self.navigationController.navigationBar setTitleTextAttributes:@{
                                   NSFontAttributeName:[UIFont systemFontOfSize:17],NSForegroundColorAttributeName:[UIColor blackColor]
                                   }];
  UIButton *playBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  playBtn.frame = CGRectMake(10, 100, 100, 20);
  [self.view addSubview:playBtn];
  [playBtn setTitle:@"开始播放" forState:UIControlStateNormal];
  [playBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [playBtn addTarget:self action:@selector(playClick) forControlEvents:UIControlEventTouchUpInside];
  
  UIButton *stopPlayBtn = [UIButton buttonWithType:UIButtonTypeCustom];
  stopPlayBtn.frame = CGRectMake(10, 150, 100, 20);
  [self.view addSubview:stopPlayBtn];
  [stopPlayBtn setTitle:@"停止播放" forState:UIControlStateNormal];
  [stopPlayBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
  [stopPlayBtn addTarget:self action:@selector(stopPlayBtnClick) forControlEvents:UIControlEventTouchUpInside];
  [self setupVisualizerView];
}

- (void)setupVisualizerView
{
  CGSize size = CGSizeMake(23, 22);
  UIEdgeInsets insets = UIEdgeInsetsMake(10, 0, 10, 20);
  size.width  = insets.left   insets.right;
  size.height  = insets.top   insets.bottom;
  // 直接直接使用visualizerView的时候,在侧滑返回的时候,会出现很奇怪的现象,visualizerView的frame会发生变化,导致显示异常
  UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
  FLAudioVisualizerView *visualizerView = [[FLAudioVisualizerView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)];
  self.visualizerView = visualizerView;
  [containerView addSubview:visualizerView];
  visualizerView.barColor = [UIColor colorWithRed:63/255 green:63/255 blue:64/255 alpha:1];
  visualizerView.contentInsets = insets;
  UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(gotoCurrentPlayPage)];
  [containerView addGestureRecognizer:tap];
  UIBarButtonItem *barItem = [[UIBarButtonItem alloc] initWithCustomView:containerView];
  self.navigationItem.rightBarButtonItem = barItem;
  
  
  
  
}

- (void)gotoCurrentPlayPage
{
  NSLog(@"点击了播放按钮");
}

- (void)playClick
{
  NSLog(@"1");
  [self.visualizerView restart];
}

- (void)stopPlayBtnClick
{
  NSLog(@"2");
  [self.visualizerView stop];
}


- (void)didReceiveMemoryWarning {
  [super didReceiveMemoryWarning];
  // Dispose of any resources that can be recreated.
}


@end

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持Devmax。

iOS如何为导航栏添加播放动画的更多相关文章

  1. Canvas实现贝赛尔曲线轨迹动画的示例代码

    这篇文章主要介绍了Canvas实现贝赛尔曲线轨迹动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  2. HTML5 直播疯狂点赞动画实现代码 附源码

    为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞动作通常无限次,引导用户疯狂点赞,今天小编给大家分享HTML5 直播疯狂点赞动画实现代码 附源码,感兴趣的朋友一起看看吧

  3. CSS中实现动画效果-附案例

    这篇文章主要介绍了 CSS中实现动画效果并附上案例代码及实现效果,就是CSS动画样式处理,动画声明需要使用@keyframes name,后面的name是人为定义的动画名称,下面我们来看看文章的具体实现内容吧,需要的小伙伴可以参考一下

  4. 基于canvas的骨骼动画的示例代码

    这篇文章主要介绍了基于canvas的骨骼动画的示例代码的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  5. html5如何在Canvas中实现自定义路径动画示例

    本篇文章主要介绍了html5如何在Canvas中实现自定义路径动画示例,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  6. 基于HTML5+Webkit实现树叶飘落动画

    本文给大家分享一段实例代码给大家介绍基于HTML5+Webkit实现树叶飘落动画效果,需要的朋友参考下吧

  7. Html5页面内使用JSON动画的实现

    这篇文章主要介绍了Html5页面内使用JSON动画的实现的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  8. html5实现图片转圈的动画效果——让页面动起来

    这篇文章主要介绍了html5实现图片转圈的动画效果——让页面动起来的相关资料,需要的朋友可以参考下

  9. 基于 HTML5 WebGL 实现的医疗物流系统

    物联网( IoT ),简单的理解就是物体之间通过互联网进行链接。这篇文章给大家介绍基于 HTML5 WebGL 实现的医疗物流系统,感兴趣的朋友跟随小编一起看看吧

  10. HTML5在微信内置浏览器下右上角菜单的调整字体导致页面显示错乱的问题

    HTML5在微信内置浏览器下,在右上角菜单的调整字体导致页面显示错乱的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部