QuartzCore проблема с отрисовкой текста в ios - PullRequest
4 голосов
/ 16 февраля 2011

мой код рисует этот текст с ног на голову. Почему?

- (void)drawRect:(CGRect)rect {
    // Drawing code.

CGContextRef myContext = UIGraphicsGetCurrentContext();  
CGRect contextRect = self.bounds;

UIGraphicsPushContext(myContext);



    CGContextSelectFont (myContext, // 3
                     "Courier",
                     24,
                     kCGEncodingMacRoman);
   CGContextSetCharacterSpacing (myContext, 1); // 4
   CGContextSetTextDrawingMode (myContext, kCGTextFillStroke); // 5

   CGContextSetRGBFillColor (myContext, 0, 1, 0, 1.0); // 6
   CGContextSetRGBStrokeColor (myContext, 1.0, 1.0, 1, 1); // 7
   CGContextShowTextAtPoint (myContext, 100, 50, "Quartz 2D", 9); 

}

1 Ответ

5 голосов
/ 16 февраля 2011

Ответ заключается в том, что CoreGraphics использует систему координат, которая берет свое начало в нижнем левом углу, что является соглашением PostScript.Однако в iOS начало координат в верхнем левом углу.

Чтобы использовать CoreGraphics, необходимо перевернуть систему координат и переместить начало координат к верхнему краю рамки.Метод drawRect должен выглядеть следующим образом.

- (void)drawRect:(CGRect)rect {
    // Drawing code.

    CGContextRef myContext = UIGraphicsGetCurrentContext();  
    CGRect contextRect = self.bounds;
    // flip transform used to transform the coordinate system from origin
    // top left corner to bottom right corner and inverting the y-axis
    CGAffineTransform flipTransform = CGAffineTransformConcat(CGAffineTransformMakeTranslation(0.f, contextRect.size.height),
                                                              CGAffineTransformMakeScale(1.f, -1.f));
    CGContextConcatCTM(myContext, flipTransform);

    UIGraphicsPushContext(myContext);



    CGContextSelectFont (myContext, // 3
                     "Courier",
                     24,
                     kCGEncodingMacRoman);
   CGContextSetCharacterSpacing (myContext, 1); // 4
   CGContextSetTextDrawingMode (myContext, kCGTextFillStroke); // 5

   CGContextSetRGBFillColor (myContext, 0, 1, 0, 1.0); // 6
   CGContextSetRGBStrokeColor (myContext, 1.0, 1.0, 1, 1); // 7
   CGContextShowTextAtPoint (myContext, 100, 50, "Quartz 2D", 9); 

}
...