本文实例为大家分享了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










