2017-03-03 38 views
0

问题描述:降`points`沿着UIBezierPath这样`点center`位于路径

创建具有沿着它的圆周点的半圆形表盘。用户可以拨打该拨号盘并拨打rotate

enter image description here

方法:

  • 创建一个UIView
  • 添加半径的圆这双了UIView的高度(使用[UIBezierPath bezierPathWithOvalInRect]CAShapeLayer
  • 添加dots(圆沿着这个圆的圆周s例如这些点的中心位于圆周上。

障碍物:

这些点沿着路径绘制,但这些点的中心不位于圆周上。

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

请注意,只有您将该图层的.anchorPoint属性保留为{0.5, 0.5}才是正确的。 有关更多信息,请参阅Core Animation Basics

+0

呃......我的整个看法现在都是绿色的。 – n00bProgrammer

+0

呃......当然不是我提出的改变。确保你没有改变任何东西。 - 请参阅编辑我的回答 – Cabus

+0

**'doh'+ facepalm **。它的工作原理,半径在一些情况下达到了5位数。修正了。谢谢 :) – n00bProgrammer