iOS如何为导航栏添加播放动画
程序员文章站
2023-12-20 16:12:04
本文实例为大家分享了ios为导航栏添加播放动画的具体代码,供大家参考,具体内容如下
flaudiovisualizerview.h
#import
本文实例为大家分享了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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。