Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 围绕圆绘制线并设置其动画_Iphone_Cocoa Touch_Uiview_Core Animation_Core Graphics - Fatal编程技术网

Iphone 围绕圆绘制线并设置其动画

Iphone 围绕圆绘制线并设置其动画,iphone,cocoa-touch,uiview,core-animation,core-graphics,Iphone,Cocoa Touch,Uiview,Core Animation,Core Graphics,我是新的核心图形,想画一个圆圈和线周围的所有方向和动画给人一种感觉射线出来的圆圈。 请就如何在圆的各个方向上实现线条动画效果提出建议 到目前为止,我画圆的代码是: - (void)drawRect:(CGRect)iRect { // Drawing code CGContextRef aContext = UIGraphicsGetCurrentContext(); [self drawMeWithContext:aContext withRect:iRect];

我是新的核心图形,想画一个圆圈和线周围的所有方向和动画给人一种感觉射线出来的圆圈。

请就如何在圆的各个方向上实现线条动画效果提出建议

到目前为止,我画圆的代码是:

- (void)drawRect:(CGRect)iRect
{
    // Drawing code
    CGContextRef aContext = UIGraphicsGetCurrentContext();
    [self drawMeWithContext:aContext withRect:iRect];
    [self drawBadgeGradientWithContext:aContext withRect:iRect];


}



- (void)drawMeWithContext:(CGContextRef)iContext withRect:(CGRect)iRect {
    CGContextSaveGState(iContext);

    CGFloat aRadius = CGRectGetMaxY(iRect) * kBadgeCornerRadius;
    CGFloat aBuffer = CGRectGetMaxY(iRect) * kScreenBuffer;
    CGFloat aMaxX = CGRectGetMaxX(iRect) - aBuffer;
    CGFloat aMaxY = CGRectGetMaxY(iRect) - aBuffer;
    CGFloat aMinX = CGRectGetMinX(iRect) + aBuffer;
    CGFloat aMinY = CGRectGetMinY(iRect) + aBuffer;

    CGContextBeginPath(iContext);
    CGContextSetFillColorWithColor(iContext, [_MyColor CGColor]);
    CGContextAddArc(iContext, aMaxX - aRadius, aMinY + aRadius, aRadius, M_PI + M_PI/2, 0, 0);
    CGContextAddArc(iContext, aMaxX - aRadius, aMaxY - aRadius, aRadius, 0, M_PI/2, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMaxY - aRadius, aRadius, M_PI/2, M_PI, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMinY + aRadius, aRadius, M_PI, M_PI + M_PI/2, 0);
    CGContextClosePath(iContext);
    CGContextFillPath(iContext);
    CGContextRestoreGState(iContext);
}


- (void)drawBadgeGradientWithContext:(CGContextRef)iContext withRect:(CGRect)iRect {
    CGContextSaveGState(iContext);

    CGFloat aRadius = CGRectGetMaxY(iRect) * kBadgeCornerRadius;
    CGFloat aBuffer = CGRectGetMaxY(iRect) * kScreenBuffer;
    CGFloat aMaxX = CGRectGetMaxX(iRect) - aBuffer;
    CGFloat aMaxY = CGRectGetMaxY(iRect) - aBuffer;
    CGFloat aMinX = CGRectGetMinX(iRect) + aBuffer;
    CGFloat aMinY = CGRectGetMinY(iRect) + aBuffer;

    CGContextBeginPath(iContext);
    CGContextAddArc(iContext, aMaxX - aRadius, aMinY + aRadius, aRadius, M_PI+(M_PI/2), 0, 0);
    CGContextAddArc(iContext, aMaxX - aRadius, aMaxY - aRadius, aRadius, 0, M_PI/2, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMaxY - aRadius, aRadius, M_PI/2, M_PI, 0);
    CGContextAddArc(iContext, aMinX + aRadius, aMinY + aRadius, aRadius, M_PI, M_PI+M_PI/2, 0);
    CGContextClip(iContext);

    size_t aNumberOfLocations = 2;
    CGFloat aLocations[2] = {0.0, 0.5};
//  CGFloat aComponents[8] = {0.98, 0.96, 0.98, 1.0, 0.698, 0.016, 0.075, 1.0};

    CGColorSpaceRef aColorSpace;
    CGGradientRef aGradient;
    aColorSpace = CGColorSpaceCreateDeviceRGB();
    aGradient = CGGradientCreateWithColorComponents (aColorSpace, _MyColorComponent, aLocations, aNumberOfLocations);
    CGColorGetComponents([[UIColor redColor] CGColor]);
    CGColorGetComponents([[UIColor whiteColor] CGColor]);
    CGPoint aStartPoint;
    CGPoint anEndPoint;
    aStartPoint.x = 0;
    aStartPoint.y = 0;
    anEndPoint.x = 0;
    anEndPoint.y = aMaxY;

    CGContextDrawLinearGradient (iContext, aGradient, aStartPoint, anEndPoint, 0);
    CGColorSpaceRelease(aColorSpace);
    CGGradientRelease(aGradient);
    CGContextRestoreGState(iContext);
}

假设你想画六条线。单位圆的周长为2π。因此,第一条线的旋转度为π/3弧度(即2π除以6),第二条线的旋转度为2π/3弧度,以此类推。将该旋转应用于每条线

现在,您需要将直线转换到圆的外侧。好的,你知道圆上的角度,你想让每条线去的地方(π/3,2π/3…2π),还有圆的半径。因此,可以创建极坐标(例如(半径,π/3))。将此极坐标点转换为笛卡尔坐标点(例如,(1,2))。你是怎么做到的?这是怎么做的

要得到x坐标,求cos(π/3),然后乘以半径。对y做同样的事情,但用罪恶代替

(2,π/3)是极坐标=>(2cos(π/3),2sin(π/3))是笛卡尔坐标

现在有了x和y坐标对,将每条线平移到其笛卡尔点。现在您需要设置线的动画。我不太熟悉iOS上的轮换能力。你能绕着圆心旋转每条线吗?否则,您必须重新计算圆上每一条直线应指向下一条直线的点,并旋转直线本身

这需要相当多的数学知识。如果你需要额外的帮助,请告诉我