2017-03-03 12 views
0

에 거짓말 문제 설명 :드롭`points`는 것을 '포인트 센터'경로

그것의 둘레를 따라 점을 가진 반원형 다이얼을 만듭니다. 사용자는이 다이얼을 팬 및 rotate 수 있습니다.

enter image description here

접근하십시오 UIView

  • 추가 된 두 배에 UIView의 높이의 반경의 원을 만든

    • ([UIBezierPath bezierPathWithOvalInRect]CAShapeLayer 사용)
    • dots (원형 추가 CALayer 개체)를이 원의 원주를 따라 이 도트의 중심이 둘레에 놓여 있다고하자.

    장애물 :

    도트가 경로를 따라 그려하지만, 이러한 점의 중심이 주위에 거짓말을하지 않습니다.

    enter image description here

    코드는 다음과 같다 :

    @property (nonatomic, retain) CAShapeLayer* dialLineLayer; 
    
    - (instancetype)initWithCoder:(NSCoder *)aDecoder { 
    
        if (self = [super initWithCoder:aDecoder]) { 
    
         self.dialLineLayer = [CAShapeLayer layer]; 
         CGRect path = CGRectMake(SCREEN_WIDTH /2 - self.radius, -self.radius, 2 * self.radius, 2 * self.radius); 
    
         [self.dialLineLayer setPath:[[UIBezierPath bezierPathWithOvalInRect:path] CGPath]]; 
         [self.dialLineLayer setStrokeColor:[[UIColor la_white10Color] CGColor]]; 
         [self.dialLineLayer setFillColor:[[UIColor clearColor] CGColor]]; 
         [self.dialLineLayer setLineWidth:3.0f]; 
         [self.layer addSublayer:self.dialLineLayer]; 
    
         [self addDotsOnLineLayer]; 
        } 
    
        return self; 
    } 
    
    - (CGFloat) radius { 
    
        // View has an aspect ratio constraint of 75:34 (W:H) 
    
        return SCREEN_WIDTH * 34/75 - 10; // Circle radius is 10px less that View's height 
    } 
    
    - (CGFloat) circumference { 
    
        return M_2_PI * self.radius; // 2Pi * radius 
    } 
    
    - (void) addDotsOnLineLayer { 
    
        CGPoint dotPoint = CGPointMake(SCREEN_WIDTH /2 - self.radius - self.radius/2, 0); 
    
        for (double t = 0; t < 2*M_PI; t += 0.2) { 
    
         CGFloat dotRadius = arc4random_uniform(10) - arc4random_uniform(3); // Random radius between 3px and 10px 
    
         CALayer* dotLayer = [CALayer layer]; 
         dotLayer.frame = CGRectMake(dotPoint.x, dotPoint.y, dotRadius, dotRadius); 
         dotLayer.cornerRadius = dotRadius/2; 
         dotLayer.masksToBounds = YES; 
         dotLayer.backgroundColor = [UIColor greenColor].CGColor; 
    
         dotPoint.x = self.radius * cos(t) + (SCREEN_WIDTH/2); 
         dotPoint.y = self.radius * sin(t) + 0; 
    
         [self.dialLineLayer addSublayer:dotLayer]; 
        } 
    } 
    
  • 답변

    3

    이 시도 : (중괄호를 주요 'DOH'+ 마른 세수를 위해;))

    dotLayer.frame = CGRectMake(0, 0, dotRadius, dotRadius); 
    dotLayer.position = dotPoint; 
    

    설명

    현재 위치 찾기 해당 경로의 출처입니다. (코너 반경을 제거하면 의미를 알 수 있습니다.) 그러나 경로의 레이어 가운데을 원하므로 .position에 할당해야합니다.

    레이어의 속성을 {0.5, 0.5}으로 두는 경우에만 적용됩니다. 자세한 내용은 Core Animation Basics을 참조하십시오.

    +0

    어 ... 내 전체보기가 녹색입니다. – n00bProgrammer

    +0

    어 ... 확실히 제가 제안한 변화가 아닙니다. 당신이 다른 것을 바꾸지 않았는지 확인하십시오. - 편집 내 대답 – Cabus

    +0

    ** 'doh'+ facepalm **보기 그것은 작동, 일부 경우에 반지름은 5 자리까지 올라 갔다. 그것을 수정했습니다. 감사 :) – n00bProgrammer