中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

iOS怎么為導航欄添加播放動畫

發布時間:2021-02-20 12:21:14 來源:億速云 閱讀:180 作者:小新 欄目:移動開發

這篇文章給大家分享的是有關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

感謝各位的閱讀!關于“iOS怎么為導航欄添加播放動畫”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

ios
AI

宜城市| 永福县| 镇安县| 神农架林区| 奉贤区| 玛纳斯县| 平罗县| 台北市| 云浮市| 无极县| 东丽区| 融水| 大新县| 筠连县| 方城县| 游戏| 沁阳市| 广灵县| 桦南县| 平山县| 新沂市| 松阳县| 武义县| 常德市| 铜川市| 昌宁县| 英德市| 碌曲县| 青神县| 合作市| 中卫市| 南漳县| 定襄县| 曲松县| 宁乡县| 台中县| 吉木乃县| 论坛| 洛阳市| 锦州市| 宜川县|