Вставить гиперссылку в PDF с использованием Core Graphics на iOS

Я пытаюсь сделать довольно простую вещь: напишите URL-адрес внутри PDF-файла, который может быть фактически нажат пользователем.

Я точно знаю, что с помощью libharu это можно сделать. То, что я ищу, - это сделать то же самое с использованием Core Graphics, поскольку весь код, который у меня уже есть в моем приложении, уже использует эти методы.

== edit ==

Я думаю, что нашел что-то: UIGraphicsSetPDFContextURLForRect , но я не могу заставить его работать.

Я использую что-то вроде:

NSURL *url = [NSURL URLWithString:@"http://www.google.com"];
UIGraphicsSetPDFContextURLForRect( url, CGRectMake(0, 0, 100, 100));

Однако прямой не является кликабельным.

4

1 ответы

Хорошо, мне удалось выяснить, почему он не работает.

Контекст основной графики «обращен» в смысле наличия начала в левом нижнем углу страницы, а UIKit имеет начало в верхнем левом углу.

Это метод, который я придумал:

- (void) drawTextLink:(NSString *) text inFrame:(CGRect) frameRect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGAffineTransform ctm = CGContextGetCTM(context);

   //Translate the origin to the bottom left.
   //Notice that 842 is the size of the PDF page. 
    CGAffineTransformTranslate(ctm, 0.0, 842);

   //Flip the handedness of the coordinate system back to right handed.
    CGAffineTransformScale(ctm, 1.0, -1.0);

   //Convert the update rectangle to the new coordiante system.
    CGRect xformRect = CGRectApplyAffineTransform(frameRect, ctm);

    NSURL *url = [NSURL URLWithString:text];        
    UIGraphicsSetPDFContextURLForRect( url, xformRect );

    CGContextSaveGState(context);
    NSDictionary *attributesDict;
    NSMutableAttributedString *attString;

    NSNumber *underline = [NSNumber numberWithInt:NSUnderlineStyleSingle];
    attributesDict = @{NSUnderlineStyleAttributeName : underline, NSForegroundColorAttributeName : [UIColor blueColor]};
    attString = [[NSMutableAttributedString alloc] initWithString:url.absoluteString attributes:attributesDict];

    [attString drawInRect:frameRect];

    CGContextRestoreGState(context);
}

Что делает этот метод:

  • , чтобы получить текущий контекст и применить преобразование к предоставленному прямоугольнику, чтобы получить прямоугольник, который будет работать при маркировке окна, когда UIGraphicsSetPDFContextURLForRect будет отмечать его как clickable
  • , чтобы пометить новый прямоугольник ( xformRect ) как clickable, используя вышеупомянутый метод
  • , чтобы сохранить текущий контекст, чтобы все, что было сделано позже (цвет, размер, атрибуты и т. д.), не остается постоянным в текущем контексте.
  • , чтобы нарисовать текст в предоставленном прямоугольнике (теперь используя систему координат UIKit)
  • для восстановления контекста GState
12
добавлено
Отличная работа, Фабиано!
добавлено автор malaki1974, источник
хорошая работа fabiano
добавлено автор sabeer, источник
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

iOS Developers — русскоговорящее сообщество
iOS Developers — русскоговорящее сообщество
2 400 участник(ов)

Общаемся на темы, посвященным iOS-разработке, Swift, Objective-C, SDK, Rx, Cocoa и т.д.