iOS: Text get upside down in drawRect function

267 views Asked by At

I am using PDFKit and create a subclass of PDFAnnotation, I want to set my custom padding when I create a free text annotation, so I try to override drawRect function as below

- (void)drawWithBox:(PDFDisplayBox)box inContext:(CGContextRef)context {
      UIGraphicsPushContext(context);
      CGContextSaveGState(context);
      NSAttributedString * mystring = [[NSAttributedString alloc] initWithString:self.contents attributes:@{
                                                                            NSFontAttributeName: self.font,
                                                                 NSForegroundColorAttributeName: UIColor.blackColor  }];

      [mystring drawInRect:CGRectMake(self.bounds.origin.x + 10, self.bounds.origin.y + 10, self.bounds.size.width-20, self.bounds.size.height-20)];
      CGContextRestoreGState(context);
      UIGraphicsPopContext();
}

The padding works well but the text is upside down.

enter image description here enter image description here

I try to add the context flipping code based on this link https://forums.developer.apple.com/thread/103683

CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, 1.0, -1.0);

after the line CGContextSaveGState(context); But it will make the text disappear! Anyone know the reason or meet the similar issue? Thanks!

1

There are 1 answers

0
wangshaoping On

I have found the answer, in case someone meets the same problem. Actually the CGContextTransform are based on the page coordinate system, so when you use transform CGContextScaleCTM(context, 1.0, -1.0); the context is outside the page range. What we need to get is X1 = X2; Y1 + Y2 = 2 * (self.bounds.origin.y + self.bounds.size.height / 2), so apply transform CGContextConcatCTM(context, CGAffineTransformMake(1, 0, 0, -1, 0.0, 2 * self.bounds.origin.y + self.bounds.size.height)); works for me.