iOS 오디 오 진행 막대 효과 구현
말 이 많 지 않 으 면 먼저 효과 도 를 올 려 라.
이 효 과 를 보 았 을 때 나 는 상대 적 으로 어 려 운 점 이 두 가지 가 있다 고 느 꼈 다.
1.이 진도 항목 의 진도 색상 변화 입 니 다.여기 서 생각 이 비교적 뚜렷 합 니 다.layer 의 mask 로 직접 하면 됩 니 다.
둘째,두 번 째 는 바로 이 각 조목 의 높이 가 일치 하지 않 고 규칙 적 이지 않다 는 것 이다.각 방법 에서 나 는 최종 적 으로 무 작위 숫자 로 하 는 것 을 선택 했다.
『8195』좋 습 니 다.생각 이 뚜렷 해 지면 코드 를 훑 기 시작 합 니 다.
먼저 View CYXAudioProgressView 를 만 듭 니 다.
@interface CYXAudioProgressView : UIView
//
@property (assign, nonatomic) CGFloat persentage;
// 0~1
-(void)setAnimationPersentage:(CGFloat)persentage;
/**
layer frame
*/
-(void)initLayers;
@end
구성원 변수 및 초기 화 방법
/* */
#define kDrawMargin 4
#define kDrawLineWidth 8
/* */
#define differenceValue 51
@interface CYXAudioProgressView ()<CAAnimationDelegate>
/* */
@property (nonatomic,strong) CAShapeLayer *shapeLayer;
/* */
@property (nonatomic,strong) CAShapeLayer *backColorLayer;
@property (nonatomic,strong) CAShapeLayer *maskLayer;
@end
@implementation CYXAudioProgressView
-(instancetype)initWithFrame:(CGRect)frame{
if (self = [super initWithFrame:frame]) {
self.backgroundColor = [UIColor blackColor];
[self.layer addSublayer:self.shapeLayer];
[self.layer addSublayer:self.backColorLayer];
self.persentage = 0.0;
}
return self;
}
그림 그리 기 방법:
/**
layer frame
*/
-(void)initLayers{
[self initStrokeLayer];
[self setBackColorLayer];
}
경로 그리 기
/* */
-(void)initStrokeLayer{
UIBezierPath *path = [UIBezierPath bezierPath];
CGFloat maxWidth = self.frame.size.width;
CGFloat drawHeight = self.frame.size.height;
CGFloat x = 0.0;
while (x+kDrawLineWidth<=maxWidth) {
CGFloat random =5+ arc4random()%differenceValue;// 1-50
NSLog(@"%f",random);
[path moveToPoint:CGPointMake(x-kDrawLineWidth/2, random)];
[path addLineToPoint:CGPointMake(x-kDrawLineWidth/2, drawHeight-random)];
x+=kDrawLineWidth;
x+=kDrawMargin;
}
self.shapeLayer.path = path.CGPath;
self.backColorLayer.path = path.CGPath;
}
노란색 경 로 를 표시 하기 위해 마스크 설정
/* masklayer*/
-(void)setBackColorLayer{
UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(0, self.frame.size.height/2)];
[path addLineToPoint:CGPointMake(self.frame.size.width, self.frame.size.height/2)];
self.maskLayer.frame = self.bounds;
self.maskLayer.lineWidth = self.frame.size.width;
self.maskLayer.path= path.CGPath;
self.backColorLayer.mask = self.maskLayer;
}
백분율 을 수 동 으로 설정 하 는 두 가지 방법
-(void)setAnimationPersentage:(CGFloat)persentage{
CGFloat startPersentage = self.persentage;
[self setPersentage:persentage];
CABasicAnimation *pathAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"];
pathAnimation.duration = 1;
pathAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
pathAnimation.fromValue = [NSNumber numberWithFloat:startPersentage];
pathAnimation.toValue = [NSNumber numberWithFloat:persentage];
pathAnimation.autoreverses = NO;
pathAnimation.delegate = self;
[self.maskLayer addAnimation:pathAnimation forKey:@"strokeEndAnimation"];
}
/**
* ,
*
* @param persentage
*/
- (void)setPersentage:(CGFloat)persentage {
_persentage = persentage;
self.maskLayer.strokeEnd = persentage;
}
최종 사용
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.view.backgroundColor = [UIColor whiteColor];
self.loopProgressView.frame =CGRectMake(0, 100, self.view.frame.size.width, 150);
[self.loopProgressView initLayers];
[self.view addSubview:self.loopProgressView];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[self.loopProgressView setAnimationPersentage:0.5];
});
self.slider.frame = CGRectMake(30, self.view.frame.size.height-60, self.view.frame.size.width-30*2, 20);
[self.view addSubview:self.slider];
}
이상 은 상술 한 효 과 를 간단하게 실현 하 였 으 니 문제 가 있 으 면 가르침 을 환영 합 니 다.Demo: https://github.com/SionChen/CYXAudioProgressView
총결산
위 에서 말씀 드 린 것 은 편집장 님 께 서 소개 해 주신 iOS 가 오디 오 진도 바 효 과 를 실현 하 는 것 입 니 다.여러분 께 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 바로 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Swift의 패스트 패스Objective-C를 대체하기 위해 만들어졌지만 Xcode는 Objective-C 런타임 라이브러리를 사용하기 때문에 Swift와 함께 C, C++ 및 Objective-C를 컴파일할 수 있습니다. Xcode는 S...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.