iOS如何為導(dǎo)航欄添加播放動(dòng)畫
本文實(shí)例為大家分享了iOS為導(dǎo)航欄添加播放動(dòng)畫的具體代碼,供大家參考,具體內(nèi)容如下
FLAudioVisualizerView.h
#import <UIKit/UIKit.h> @interface FLAudioVisualizerView : UIView #pragma mark - // 默認(rèn)UIEdgeInsetsZero @property (nonatomic, assign) UIEdgeInsets contentInsets; // 默認(rèn)為4 @property (nonatomic, assign) NSInteger barCount; @property (nonatomic, copy) NSArray<NSNumber *> *barHeightRateList; // 默認(rèn)白色 @property (nonatomic, copy) UIColor *barColor; // 默認(rèn)2 @property (nonatomic, assign) CGFloat cornerRadius; // 默認(rèn)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 = @"首頁";
//修改導(dǎo)航欄標(biāo)題字體大小和顏色,背景顏色
[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的時(shí)候,在側(cè)滑返回的時(shí)候,會(huì)出現(xiàn)很奇怪的現(xiàn)象,visualizerView的frame會(huì)發(fā)生變化,導(dǎo)致顯示異常
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(@"點(diǎn)擊了播放按鈕");
}
- (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
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- iOS實(shí)現(xiàn)知乎和途家導(dǎo)航欄漸變的文字動(dòng)畫效果
- iOS實(shí)現(xiàn)頂部標(biāo)簽式導(dǎo)航欄及下拉分類菜單
- IOS仿今日頭條滑動(dòng)導(dǎo)航欄
- 詳解iOS11關(guān)于導(dǎo)航欄問題
- iOS應(yīng)用開發(fā)中導(dǎo)航欄按鈕UIBarButtonItem的添加教程
- iOS App開發(fā)中導(dǎo)航欄的創(chuàng)建及基本屬性設(shè)置教程
- 兩種iOS隱藏導(dǎo)航欄的正確方法
- iOS11適配工作及導(dǎo)航欄影藏返回文字的解決方法
- iOS實(shí)現(xiàn)導(dǎo)航欄透明示例代碼
- iOS仿微博導(dǎo)航欄動(dòng)畫(CoreGraphics)的實(shí)現(xiàn)方法
相關(guān)文章
iOS實(shí)現(xiàn)百度地圖拖拽后更新位置以及反編碼
百度地圖已經(jīng)開放了地圖API,大家可以很方便的調(diào)用地圖中的相應(yīng)數(shù)據(jù),并完成各項(xiàng)個(gè)性化的展示,下面這篇文章主要給大家介紹了關(guān)于iOS如何實(shí)現(xiàn)百度地圖拖拽后更新位置以及反編碼的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-12-12
iOS之Https自簽名證書認(rèn)證及數(shù)據(jù)請(qǐng)求的封裝原理
本篇文章主要介紹了iOS之Https自簽名證書認(rèn)證及數(shù)據(jù)請(qǐng)求的封裝原理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。2017-02-02
Xcode8下iOS10常見報(bào)錯(cuò)閃退,字體適配和編譯不過的問題及解決方案
蘋果推送了iOS10,好多朋友迅速即將系統(tǒng)升級(jí)了ios10,然后遇到好多問題。下面小編給針對(duì)遇到的問題給大家介紹解決方法,希望對(duì)大家有所幫助,感興趣的朋友可以參考下2016-09-09
iOS實(shí)現(xiàn)輪盤動(dòng)態(tài)效果
這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)輪盤動(dòng)態(tài)效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-04-04
iOS 讀取URL圖片并存儲(chǔ)到本地的實(shí)例
下面小編就為大家?guī)硪黄猧OS 讀取URL圖片并存儲(chǔ)到本地的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2017-12-12
iOS 10撥打系統(tǒng)電話彈出框延遲出現(xiàn)問題的解決
iOS10的到來,帶來了條幅和鎖屏界面的重新設(shè)計(jì),美觀又好看,再加上抬腕喚醒功能,查看需要的信息確實(shí)更便捷了,還能快捷回復(fù)一些通知,十分輕松,但同樣有問題,下面這篇文章主要給大家介紹了關(guān)于iOS 10撥打系統(tǒng)電話彈出框延遲出現(xiàn)問題的解決方法,需要的朋友可以參考下。2017-10-10
深入解析設(shè)計(jì)模式中的裝飾器模式在iOS應(yīng)用開發(fā)中的實(shí)現(xiàn)
這篇文章主要介紹了設(shè)計(jì)模式中的裝飾器模式在iOS應(yīng)用開發(fā)中的實(shí)現(xiàn),包括對(duì)分類和委托的深入講解,需要的朋友可以參考下2016-03-03

