Search code examples
objective-cioscgcontextcgaffinetransform

Text center after Rotation with CG in IOS


I have to rotate a text that's inside of circle, but I could not get it center at arc draw. I succeedd to rotate with CGAffineTranform but the text is always not center in radial. Note: The text is place inside of an arc.

float l_angleText=lStartAngle+((lStopAngle-lStartAngle)/2);
    CGContextSelectFont(p_contex, "Helvetica", 12.5, kCGEncodingMacRoman);

    CGAffineTransform myTransform=CGAffineTransformRotate(CGAffineTransformMakeScale(1,-1),-l_angleText);
    CGContextSetTextMatrix(p_contex, myTransform);

    CGContextSetTextDrawingMode(p_contex, kCGTextFill);
    CGContextSetRGBFillColor(p_contex, 1.0, 1.0, 1.0, 1.0); //White 

    // get x/y for an the angle. The point in which I start drawing the text.
    CGPoint lPoints = angleRToPoint(-l_angleText,[self getRadioPoint:l_angleText]);    

    //Move the point according the coords. 
    const double l_pointX = mReference.x+lPoints.x;
    const double l_pointY = mReference.y-lPoints.y;
    NSString* lText= [self getText];
    CGContextShowTextAtPoint(p_contex,  l_pointX, l_pointY, [lText UTF8String] , strlen([lText UTF8String]));

Solution

  • I;ve just resolved using quadrant approach, fixing the offset with sin an cos. The solution provide a good experience.

    -(CGPoint) getShiftToCenter:(const float) angle
    {
        CGPoint lRet;
        unsigned int x = getCuadrante(angle);
        float rx,ry;
        switch (x) {
            case 1:
                rx=-sin(angle);
                ry=cos(angle);
                break;
            case 2:
                rx=cos(angle);
                ry=-cos(angle);
                break;
            case 3:
                rx=sin(angle);
                ry=-cos(angle);
                break;
            case 4:
                rx=-sin(angle);
                ry=cos(angle);
                break;
            default:
                break;
        }
    
    
        const float lFactor=4; // this is according to size of the font use it
        lRet.x=lFactor*rx;
        lRet.y=lFactor*ry;
    
        NSLog(@"Cuad %d , An %f ; x=%f - y=%f", x, angle, lRet.x,lRet.y);
    
    
        return  lRet;
    }