我有一个自定义的UIControl,如下所示:
白色环在drawRect中绘制如下:
//Get current context
CGContextRef mainContext = UIGraphicsGetCurrentContext();
/** Draw the Path **/
//Create the path
CGContextAddArc(mainContext, self.frame.size.width/2, self.frame.size.height/2, radius, 0, 2*M_PI, 0);
//Set the stroke color to white
[[UIColor whiteColor]setStroke];
//Define line width and cap
CGContextSetLineWidth(mainContext, HOUR_PICKER_BACKGROUND_WIDTH);
CGContextSetLineCap(mainContext, kCGLineCapButt);
//Draw the path
CGContextDrawPath(mainContext, kCGPathStroke);
黑色圆圈为CAShapeLayer
,绘制如下:
hourSelector = [CAShapeLayer layer];
hourSelector.path = [UIBezierPath bezierPathWithRoundedRect:selectorPosition cornerRadius:11.0].CGPath;
hourSelector.fillColor = [UIColor colorWithRed:65.0f/255.0f green:75.0f/255.0f blue:86.0f/255.0f alpha:1.0f].CGColor;
hourSelector.strokeColor = [UIColor colorWithRed:65.0f/255.0f green:75.0f/255.0f blue:86.0f/255.0f alpha:1.0f].CGColor;
hourSelector.lineWidth = 1;
[self.layer addSublayer:hourSelector];
我已经能够在白色环上的任何位置拖动黑色圆圈。当我让黑色圆圈移动时,我希望能够将黑色圆圈设置为环上某个位置的动画。当手指从圆圈上抬起时,我得到了结束触摸位置的弧度值以及圆圈所需的最终位置。我也有矩形/笛卡尔坐标的点。我试图通过在两点之间绘制一条弧并使用CAKeyFrameAnimation
沿弧线改变圆的位置来实现所需的行为。
CAKeyframeAnimation *pathAnimation = [CAKeyframeAnimation animationWithKeyPath:@"position"];
pathAnimation.calculationMode = kCAAnimationPaced;
pathAnimation.fillMode = kCAFillModeForwards;
pathAnimation.removedOnCompletion = NO;
pathAnimation.duration = 1.0;
CGMutablePathRef arcPath = CGPathCreateMutable();
CGPathAddArc(arcPath, NULL, self.frame.size.width/2, self.frame.size.height/2, radius, endingTouchRadian, finalPositionRadian,0);
pathAnimation.path = arcPath;
CGPathRelease(arcPath);
[hourSelector addAnimation:pathAnimation forKey:@"moveHour"];
我的问题是创建的弧线在白色环上无处可寻。 self.frame.size.height
(和相应的宽度)是用于创建白色圆环的相同圆心,但弧线是在屏幕外创建的。此外,对于x使用0,0,y不返回框架的左上角,而是返回主窗口的确切中心。每次旋转圆圈时,圆弧的圆心似乎都会改变,然后松开。
我是否错过了如何将圆弧的中心设置为与白色圆圈的中心相同?
答案 0 :(得分:4)
我明白了。我在drawRect之外创建了CGPath,它正在重新绘制具有不同来源的视图。我不明白底层到底发生了什么,但将CGPath创建代码移动到drawRect解决了这个问题。感谢@Unheilig用他的评论指引我正确的方向。
答案 1 :(得分:0)
如果你的圈子是
那么中心不会CGRectGetMidX(selectorPosition), CGRectGetMidY(selectorPosition)
你正在使用视图宽度和高度的一半,忽略它的原点。