Основная графика, вращающая путь

Это должно быть просто, в основном у меня есть несколько путей, нарисованных с помощью основной графики, и я хочу иметь возможность вращать их (для удобства). Я пробовал использовать CGContextRotateCTM(context); но ничего не крутит. Я что-то упускаю?

Вот исходник для drawRect

- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();

CGContextSetLineWidth(context, 1.5);
CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextSetShadow(context, CGSizeMake(0, 1), 0);

CGContextBeginPath(context);

CGContextMoveToPoint(context, 13.5, 13.5);
CGContextAddLineToPoint(context, 30.5, 13.5);
CGContextAddLineToPoint(context, 30.5, 30.5);
CGContextAddLineToPoint(context, 13.5, 30.5);
CGContextAddLineToPoint(context, 13.5, 13.5);

CGContextClosePath(context);

CGContextMoveToPoint(context, 26.2, 13.5);
CGContextAddLineToPoint(context, 26.2, 17.8);
CGContextAddLineToPoint(context, 30.5, 17.8);

CGContextMoveToPoint(context, 17.8, 13.5);
CGContextAddLineToPoint(context, 17.8, 17.8);
CGContextAddLineToPoint(context, 13.5, 17.8);

CGContextMoveToPoint(context, 13.5, 26.2);
CGContextAddLineToPoint(context, 17.8, 26.2);
CGContextAddLineToPoint(context, 17.8, 30.5);

CGContextStrokePath(context);

CGContextSetFillColorWithColor(context, [UIColor whiteColor].CGColor);
CGContextSetShadowWithColor(context, CGSizeMake(0, 0), 0, [UIColor clearColor].CGColor);

CGContextFillRect(context, CGRectMake(26.2, 13.5, 4.3, 4.3));
CGContextFillRect(context, CGRectMake(13.5, 13.5, 4.3, 4.3));
CGContextFillRect(context, CGRectMake(13.5, 26.2, 4.3, 4.3));

CGContextRotateCTM(context, M_PI / 4);
}

person Scott Langendyk    schedule 06.04.2010    source источник
comment
Можете ли вы включить исходный код? CGContextRotateCTM(context) является правильной функцией, но трудно увидеть, есть ли у вас ошибка в вашем коде, если вы ее не включаете!   -  person Kevin Sylvestre    schedule 06.04.2010
comment
Я обновил свой исходный пост, чтобы включить источник, любая помощь будет принята с благодарностью!   -  person Scott Langendyk    schedule 06.04.2010


Ответы (1)


Поместите это перед рисованием / заполнением фигуры, чтобы перевести ее в исходное положение, повернуть, а затем перевести обратно в точку, вокруг которой она должна вращаться:

static inline float radians(double degrees) { return degrees * M_PI / 180; }

CGContextTranslateCTM(c, midX, midY);
CGContextRotateCTM(c, radians(-73));
CGContextTranslateCTM(c, -midX, -midY);

Измените значение угла, переданное в CGContextRotateCTM, чтобы фигура указывала в другом направлении.

person Adam Eberbach    schedule 13.05.2010
comment
Это требует больше любви, это сработало для меня, и это именно то, что мне было нужно - person DFectuoso; 30.05.2010
comment
Просто потратил вечность на это барахло. Приземлился здесь в нерабочее время и понял, что проголосовал за это 2 года назад. Это действительно простое решение, которое работает безупречно. Полностью согласен @DFectuoso :) - person Sam Soffes; 24.09.2013
comment
Что такое midX и midY - person Burhanuddin Sunelwala; 01.11.2013
comment
(midX, midY) — это точка, вокруг которой должен вращаться ваш объект. - person Adam Eberbach; 03.11.2013
comment
Я поместил код поворота в ответ перед CGContextBeginPath(context); и любыми последующими вызовами CGContextMoveToPoint / CGContextAddLineToPoint... Первоначально я интерпретировал ответ как означающий: поместить перед CGContextSetFillColorWithColor и/или CGContextDrawPath звонки... но в этом случае ротация не применялась. Это должно было быть до создания path. Спасибо. - person Gavin Hope; 14.07.2015