아이폰 OS는 구현의 점차적 인 진도 아크

이 프로젝트는 점진적으로 진행 표시 줄이 링 과정을 보여줍니다 필요로하기 때문에,이 편의를 온라인으로 관련 정보를 많이 가지고 않습니다, 그러나 대부분은 단지 코드의 무리도 완료 넣어 더 세분화하고있다. 여기에 나는이 과정 진행률 표시 줄의 내 자신의 상세한 구현을 작성하고 싶습니다.

아크 진행 바는 세 단계로 나누어진다 달성
UIBezierPath : 본원에서 사용되는, 비디오 베지 아크이 무엇
개의 베 지어 곡선 두 호 동영상에 배경 채우기 색상 상기 경로를 따라 이 클래스 CAShapeLayer.h에 사용되는
두 색 그라데이션을 그릴 그라데이션 색상에 위의 경로의 진행을 매핑, 셋째, 사용 그라데이션 색상이 일의 CAGradientLayer.h입니다

대상 효과가 표시됩니다


AirPlay_Movie_2017-11-29_04-42-48.gif

첫 번째 단계 :

  • 상부 링은 사용자 정의 색상 동안 우리 번들 패턴이 링의 상단에 동그라미에 중첩, 반지는 회색 배경입니다.
    • 첫째, 우리는 그릴 여기 UIBezierPath로, 사실, 거친 원을 원을 그립니다.
      사진 결과 :



      코드 :

    //贝塞尔曲线画圆弧
      UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.width / 2, self.height / 2) radius:(self.width - 20)/2 startAngle:0 endAngle:2 * M_PI clockwise:YES]; //设置颜色 [[UIColor blackColor] set]; //线粗细 circlePath.lineWidth = 10; //开始绘图 [circlePath stroke]; 

다음은 주로이 방법에주의해야 할 사항 :

+ (instancetype)bezierPathWithArcCenter:(CGPoint)center radius:(CGFloat)radius startAngle:(CGFloat)startAngle endAngle:(CGFloat)endAngle clockwise:(BOOL)clockwise; 

다섯 개 매개 변수는
센터 : 센터
반경 : 반경
startAngle로부터는 : 시작 각도
endAngle가 : 종료 각도
시계 방향 : 시계 방향인지 페인트
주요 이해하기 어려운 startAngle로부터 endAngle

OC에의 공식 문서에서 이러한 조항 :
공식 문서 그려 아크 .JPG

그래서 1π / 4 최종 시작 3π / 4에서 아크 목표를 그릴 필요가
다음과 같이 방법 :

UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.width / 2, self.height / 2) radius:(self.width - 20)/2 startAngle:M_PI / 4 + M_PI / 2 endAngle:M_PI / 4 clockwise:YES]; 

렌더링 :


블랙 원형 경로 .JPG

단계 :

  • CAShapeLayer 동영상 좋은 층으로 그려진 경로의 첫 번째 단계는 최대 레이어에
    비디오 회색 서클에 :
    CAShapeLayer *bgLayer = [CAShapeLayer layer];
    bgLayer.frame = self.bounds;
    bgLayer.fillColor = [UIColor clearColor].CGColor;//填充色 - 透明 bgLayer.lineWidth = 20.f; bgLayer.strokeColor = ZCCRGBColor(212, 212, 212, 1.0).CGColor;//线条颜色 bgLayer.strokeStart = 0;//起始点 bgLayer.strokeEnd = 1;//终点 bgLayer.lineCap = kCALineCapRound;//让线两端是圆滑的状态 bgLayer.path = circlePath.CGPath;//这里就是把背景的路径设为之前贝塞尔曲线的那个路径 [self.layer addSublayer:bgLayer]; 

렌더링 :


곡선 진행률 표시 줄 배경색 .JPG
  • 진행률 표시 줄의 호를 그리
_shapeLayer = [CAShapeLayer layer];
    _shapeLayer.frame = self.bounds;
    _shapeLayer.fillColor = [UIColor clearColor].CGColor;
    _shapeLayer.lineWidth = 20.f;
    _shapeLayer.lineCap = kCALineCapRound;
// _shapeLayer.strokeColor = color.CGColor; _shapeLayer.strokeColor = [UIColor blueColor].CGColor; _shapeLayer.strokeStart = 0; _shapeLayer.strokeEnd = 0.8; _shapeLayer.path = circlePath.CGPath; [self.layer addSublayer:_shapeLayer]; 
위는 거의 같은 코드이며,이 strokenEnd 색상 속성은 다음과 같은 효과가 진행 완전히 전체 있지 않은지 확인 변경 :
파란색 막대 .JPG

세 번째 단계 :
이 두 단계의 기초를 완료한다. 이제이 일의 가장 번잡 한 그라데이션입니다. 첫째, 그라디언트 레이어 클래스의 과정에 익숙해 질, CAGradientLayer이 하위 클래스 계층, 나는 이러한 예는 언어를 사용하도록 지시

//初始化一个渐变图层
    CAGradientLayer *leftGradientLayer = [CAGradientLayer layer];
//设frame
    leftGradientLayer.frame = CGRectMake(0, 0, self.width / 2, self.height); //设渐变颜色 //ZCCRGBColor是我自定义的宏 #define ZCCRGBColor(a,b,c,al) [UIColor colorWithRed:a/255.0 green:b/255.0 blue:c/255.0 alpha:al] [leftGradientLayer setColors:[NSArray arrayWithObjects:(id)ZCCRGBColor(255, 255, 0, 1).CGColor, (id)ZCCRGBColor(255, 0, 0, 1).CGColor, nil]]; //这里设置渐变色渐变范围 0到1就是整个leftGradientLayer上都在渐变 [leftGradientLayer setLocations:@[@0,@1]]; //下面这两个就是渐变色方向Y越大就是越下面 所以是从下到上从黄到红渐变 [leftGradientLayer setStartPoint:CGPointMake(0, 1)]; [leftGradientLayer setEndPoint:CGPointMake(0, 0)]; 添加到父图层 [_gradientLayer addSublayer:leftGradientLayer]; 
렌더링 봐
구배 층 .JPG 아래쪽에서 위쪽 왼쪽

이 방법을 수정

 [leftGradientLayer setLocations:@[@0,@0.5]];

렌더링 :


그라데이션 .JPG의 절반 만

모든 적색 구배의 상부 절반의 한 면만.

차 제어 속성이 경사 방향 수정

     [leftGradientLayer setLocations:@[@0,@1]];
    [leftGradientLayer setStartPoint:CGPointMake(0, 1)];
    [leftGradientLayer setEndPoint:CGPointMake(1, 0)];

그런 다음과 같이 대각 구배이다 :


대각선 그라데이션 .JPG

이렇게 간단한 도트 그라데이션을하는 것은 링도 동일한 폭과 높이를 설정하는 고리이다.


그라데이션 조각 .JPG

그런 다음, 상기 링 층 색상 그라데이션 층에 매핑 될 수있는 코드의 다음 줄을 추가

[self.gradientLayer setMask:_shapeLayer];

렌더링


대각선 그라데이션 아크 .JPG

그러나 사실 문제가 아크 당신이 아래의 전체 일정을 볼 수 있습니다 때 경우, 여기에 있습니다 :


대각선 그라데이션 전체 아크 .JPG

당신은 위가 진정한 그라데이션하지 그래서 빨간색하지 않습니다 사진의 오른쪽 아래 모서리를 볼 수 있습니다. 그래서 결국 어떻게 사실 그라데이션 반지 할까?

사실, 그냥 예시 (豫 示)를 매장 할 때 그라데이션 레이어 위에 그림을 시작했다.

그리고 근면하게 몇 가지 속성을 테스트하는 그라디언트 레이어, 사실, 다음과 같은 효과 :
.JPG 주위 그라데이션 층
다음 효과도 아크에 매핑됩니다 :
원호 블록 맵핑 그라데이션 .JPG 주위

실제로,이 문제는 여기에 과량의 최고 중요한 결함이있을 것이라는 것이다
우리가 [leftGradientLayer setLocations를 @ [0 @ 사용 0.5 @]; 이 속성이 설정된 경사도 범위. 기본 그라디언트 색상의 상단이 고정합시다

左边的渐变色块:
[leftGradientLayer setLocations:@[@0,@0.9]];
右边的渐变色块:
[rightGradientLayer setLocations:@[@0.1, @1]];

렌더링 봐


.png를 그림

친구가 실제로 상단 왼쪽 하단 → 왼쪽 → 점진적 재 매핑 된 다음에 바로 → 오른쪽에서 4 개 색 그라데이션을 얻을 수 있다면 그것은 더 완벽 할 수 있도록 음, 이것은 거의 완벽한 그라데이션 호 및 강박 장애입니다.

마지막으로 마쳤다. . 당신이 나에게 묻는 메시지를 남길 수있는 방법을 지적 화가 잘못된 장소 무엇 이러한 교육의 텍스트를 작성하는 초보자 처음 모른다

마지막으로, 애니메이션을 달성하는 방법은? ?
이것은 타이머 설정 _shapeLayer.strokeEnd strokEnd 속성에 의해 달성 달성
다음은 ~ 특정 코드

- (void)animateToProgress:(CGFloat)progress{
    
//    NSLog(@"增加到progress%lf", progress);
    
    if(_shapeLayer.strokeEnd != 0){ [self animateToZero]; } __weak typeof(self)weakSelf = self; NSLog(@"-----%lf",_shapeLayer.strokeEnd); dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(_shapeLayer.strokeEnd * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ [weakSelf deleteTimer]; NSString *progressStr = [NSString stringWithFormat:@"%lf",progress]; NSDictionary *userInfo = @{@"progressStr":progressStr}; weakSelf.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:weakSelf selector:@selector(animate:) userInfo:userInfo repeats:YES]; }); } - (void)animate:(NSTimer *)time{ CGFloat progress = [[time.userInfo objectForKey:@"progressStr"] floatValue]; if(_shapeLayer.strokeEnd <= progress) { _shapeLayer.strokeEnd += 0.01; }else{ [self deleteTimer]; } } //回滚到0 先判断 timer 有没有存在 存在 就把timer 删除 - (void)animateToZero{ // NSLog(@"删除到0"); [self deleteTimer]; self.timer = [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(animateReset) userInfo:nil repeats:YES]; } - (void)animateReset{ if(_shapeLayer.strokeEnd > 0){ _shapeLayer.strokeEnd -= 0.01; }else{ [self deleteTimer]; } } - (void)deleteTimer{ [self.timer invalidate]; self.timer = nil; } 

전체 코드 GitHub의 링크



저자 : zcc_ios의
링크 : HTTPS : //www.jianshu.com/p/edbc647ff178
출처 : 제인 책
저자가 보유 제인 책의 저작권은, 어떤 형태로도 복제되어, 승인을 얻기 위해 작성자에게 문의하고 소스를 표시하시기 바랍니다.

추천

출처www.cnblogs.com/Free-Thinker/p/11124510.html