2013-03-29 4 views
1

ребята! мне нужно сделать некоторые изображения в CGContext.This соответствующий код:cgcontext поворот прямоугольника

CGContextSaveGState(UIGraphicsGetCurrentContext()); 

CGContextRef ctx = UIGraphicsGetCurrentContext(); 

CGRect rect = r; 

CGContextRotateCTM(ctx, DEGREES_TO_RADIANS(350)); 
[image drawInRect:r]; 


CGContextRestoreGState(UIGraphicsGetCurrentContext()); 

На самом деле, прямоугольник поворота и отображения на площади, что это не мой purpose.I просто хочу повернуть изображение и дисплей на том же месте. Любые идеи ?????

+1

Возможно, вы захотите попробовать ввести текст вопроса на своем родном языке, а затем с помощью Google Translate перевести его на английский, потому что очень сложно понять, что вы пытаетесь задать здесь. –

+0

Theres также отличный ответ здесь - https://teamtreehouse.com/community/saving-a-rotated-image-with-cgcontextrotatectm – MendyK

+1

Возможный дубликат [повернуть изображение с помощью CGContextDrawImage] (http://stackoverflow.com/questions/ 16766111/rotate-image-use-cgcontextdrawimage) –

ответ

15

Rotation о происхождении данного контекста, который является то же самое, что прямоугольники относительно. Если представить лист миллиметровой бумаги в фоновом режиме, вы можете увидеть, что происходит на более ясно:

Rotated context with graph-paper grid in the background and rectangle in the foreground

Линия «снизу» (у = 0) из вашего окна/вид/слой/контекст. Конечно, вы можете рисовать ниже дна, если хотите, и если ваш контекст трансформируется правильно, вы можете даже увидеть его.

В любом случае, я предполагаю, что то, что вы хотите сделать, - это поворот прямоугольника на место по отношению к нерожденному миру, а не вращение мира и все в нем.

Единственный способ повернуть что-либо, чтобы повернуть мир, так что, как вам нужно сделать, это:

  1. Сохранить в графическое состояние.
  2. Перевести источник в точку, где вы хотите нарисовать прямоугольник. (Вы, вероятно, хотите, чтобы перевести его центральной точку, а не происхождение прямоугольника.)

    Translated context with graph-paper background, showing the origin at what will be the center of the rectangle

  3. Поворот контекста.

    Translated and rotated context with graph-paper background, showing that the axes have now tilted up as before, but now the translated origin has also moved just as the rectangle did

  4. Нарисуйте прямоугольник с центром в начале координат. Другими словами, исходная точка вашего прямоугольника должна быть отрицательной на половину ширины и отрицательной половины ее высоты (т. Е. (CGPoint){ width/-2.0, height/-2.0 }) - не использовать исходное значение, которое оно имело до этого, потому что вы уже использовали это на этапе перевода.

    Rectangle drawn in its position, with graph-paper background and origin lines removed

  5. Восстановление gstate так что будущее рисунок не поворачивается.

+0

Я смог повернуть прямоугольник с помощью этой логики, но как только я положил палец вверх, а конец поворота заканчивается, прямоугольник уходит (исчезает)? Есть идеи? – iAviator

-2

использовать следующий код, чтобы повернуть изображение

// преобразовать градусы в радианы

CGFloat DegreesToRadians(CGFloat degrees) 
{ 
    return degrees * M_PI/180; 
}; 

записать его в методе DrawRect

// create new context 
CGContextRef context = UIGraphicsGetCurrentContext(); 
// define rotation angle 
CGContextRotateCTM(context, DegreesToRadians(45)); 
// get your UIImage 
UIImage *img = [UIImage imageNamed:@"yourImageName"]; 
// Draw your image at rect 
CGContextDrawImage(context, CGRectMake(100, 0, 100, 100), [img CGImage]); 
// draw context 
UIGraphicsGetImageFromCurrentImageContext(); 
+0

Как это существенно отличается от того, что делает код в вопросе, и что делает этот код корректным, когда код в вопросе не работает? –

+0

Я рисую изображение, используя контекст & imageRef, где в вопросе его нет. –

+0

Как рисовать изображение с использованием CGContext и CGImage отличается от, и лучше, чем указывать UIImage для рисования? –

0

Что сработало для меня, было сначала использовать матрицу поворота, чтобы рассчитать объем перевода, необходимый для того, чтобы ваше изображение центрировалось. Ниже я предполагаю, что вы уже рассчитали centerX и centerY, чтобы быть центром вашей рамки, а «theta» - ваш желаемый угол поворота в радианах.

let newX = centerX*cos(theta) - centerY*sin(theta) 
let newY = centerX*sin(theta) + centerY*cos(theta) 

CGContextTranslateCTM(context,newX,newY) 
CGContextRotateCTM(context,theta) 
<redraw your image here> 

Работал отлично. Надеюсь, поможет.

Смежные вопросы