Intereting Posts
метод tableView editActionsForrowAtIndexPath с объективом-c селектором конфликтует с методом из суперкласса Добавлять ли кнопки UINavigationController необходимо автореализовать? это код? Swift SystemSoundIDButton Vibrate Firebase iOS SDK: как получить несколько данных в одном запросе Почему значение в этом словаре изменяется? Утончение приложения с целью развертывания, установленной для iOS 6 SCNText рендеринг без кривых, а не шрифт Индикатор загрузки изображения Firebase Progress-Indicator -Swift iOS Как нарисовать только контур текста, но не заполнять себя? Вызовите UIAlert на обратном вызове центра уведомления Darwin UIScrollView, когда contentOffset не в начале, не запускает UIGestureRecognizers, прикрепленный к subviews UIAlertController в статическом методе, дающем ошибку: дополнительный аргумент, анимированный в ячейке Почему iOS CLLocation показывает неправильные значения? Справка с MapKit три аннотации с тремя различными цветами контактов как избежать сильной ссылки в обратном вызове UIAlertViewController

Проблемы с размещением NSAttributedString в PDF-файле

Я динамически создаю PDF-документ в приложении iOS. Я пытаюсь преобразовать строку в формате HTML в NSAttributedString, а затем разместить ее на моей странице документа PDF.

Если я обрабатываю строку как обычный NSString, я могу установить ее фрейм и разместить его в любом месте страницы (html-теги, включенные в строку).

Если я создаю NSAttributedString, используя initWithString, я также могу разместить полученную атрибутированную строку в любом месте страницы.

Если я преобразую строку в NSAttributedString, используя

NSAttributedString initWithData:options:documentAttributes:error:

конверсия работает отлично, и теги преобразуются в атрибуты. Но когда я пытаюсь расположить фрейм строки на странице, текст обрезается, когда я перемещаю рамку вниз и справа от 0,0. Я могу переместить фрейм на 20 пунктов, прежде чем текст обрезается сверху, по строкам. Я могу перемещать рамку прямо до начала координат больше, чем ширина, когда весь текст исчезает со страницы.

Код:

 #pragma mark - === PDF BUILD Methods === - - (void)buildPDF { self.pdfPageSize = CGSizeMake(850.0, 1100.0); UIFont *titleFont = [UIFont fontWithName:@"Dispatch-Bold" size:24.0]; UIFont *bodyFont = [UIFont systemFontOfSize:18.0]; // Open a new PDF dcument [self setupPDFDocumentNamed:@"testPDF" Width:self.pdfPageSize.width Height:self.pdfPageSize.height]; //cover page [self beginPDFPage]; NSString *title = [NSString stringWithFormat:@"How to Tie a %@", self.knot.knotName]; [self addText:title withFrame:CGRectMake(0, 10, 850, 30) font:titleFont alignment:NSTextAlignmentCenter]; [self addLineWithFrame:CGRectMake(10, 40, 830, 2) withColor:[CSCColors favoritesColor]]; NSString *imageName = [NSString stringWithFormat:@"%@_0", self.knot.knotID]; [self addImage:[UIImage imageNamed:imageName] atPoint:CGPointMake(50, 50)]; // addText method works, but addHTML method does not //[self addText:self.knot.knotDescription withFrame:CGRectMake(400, 50, 300, 500) font:bodyFont alignment:NSTextAlignmentLeft]; [self addHTMLText:self.knot.knotDescription withFrame:CGRectMake(400, 50, 300, 500) font:bodyFont alignment:NSTextAlignmentLeft]; //close out the PDF [self finishPDF]; } -(void)setupPDFDocumentNamed:(NSString*)name Width:(float)width Height:(float)height { self.pdfPageSize = CGSizeMake(width, height); NSString *newPDFName = [NSString stringWithFormat:@"%@.pdf", name]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *pdfPath = [documentsDirectory stringByAppendingPathComponent:newPDFName]; UIGraphicsBeginPDFContextToFile(pdfPath, CGRectZero, nil); } - (void)beginPDFPage { UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, self.pdfPageSize.width, self.pdfPageSize.height), nil); } - (void)finishPDF { UIGraphicsEndPDFContext(); } - (void)addText:(NSString*)text withFrame:(CGRect)frame font:(UIFont*)font alignment:(NSTextAlignment)alignment{ // Set up character and paragraph attributes UIColor * cscBlueColor = [UIColor colorWithRed:0.0 green:0.53 blue:0.8 alpha:1.0]; NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init]; paraStyle.lineBreakMode = NSLineBreakByWordWrapping; paraStyle.alignment = alignment; //Calculate frame NSDictionary *attr = @{NSFontAttributeName:font}; CGRect textRect = [text boundingRectWithSize:frame.size options:NSStringDrawingUsesLineFragmentOrigin attributes:attr context:nil]; CGSize stringSize = textRect.size; float textWidth = frame.size.width; if (textWidth < stringSize.width) textWidth = stringSize.width; if (textWidth > _pdfPageSize.width) textWidth = _pdfPageSize.width - frame.origin.x; CGRect renderingRect = CGRectMake(frame.origin.x, frame.origin.y, textWidth, stringSize.height); NSDictionary *renderingAttr = @{NSParagraphStyleAttributeName:paraStyle, NSFontAttributeName:font, NSForegroundColorAttributeName:cscBlueColor}; [text drawInRect:renderingRect withAttributes:renderingAttr]; } - (void)addHTMLText:(NSString*)text withFrame:(CGRect)frame font:(UIFont *)font alignment:(NSTextAlignment)alignment{ NSMutableAttributedString *myString = [[NSMutableAttributedString alloc] initWithData:[text dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil]; NSRange myRange; myRange.location = 0; myRange.length = myString.length; // Set up character and paragraph attributes UIColor * cscBlueColor = [UIColor colorWithRed:0.0 green:0.53 blue:0.8 alpha:1.0]; NSMutableParagraphStyle *paraStyle = [[NSMutableParagraphStyle alloc] init]; paraStyle.lineBreakMode = NSLineBreakByWordWrapping; paraStyle.paragraphSpacing = 10.0f; paraStyle.alignment = alignment; NSDictionary *renderingAttr = @{NSParagraphStyleAttributeName:paraStyle, NSFontAttributeName:font, NSForegroundColorAttributeName:cscBlueColor}; [myString addAttributes:renderingAttr range:myRange]; //Calculate frame NSStringDrawingContext *sdctx = [[NSStringDrawingContext alloc] init]; CGRect textRect = [myString boundingRectWithSize:CGSizeMake(frame.size.width, CGFLOAT_MAX) options:NSStringDrawingUsesLineFragmentOrigin context:sdctx]; CGSize stringSize = textRect.size; float textWidth = frame.size.width; if (textWidth < stringSize.width) textWidth = stringSize.width; if (textWidth > _pdfPageSize.width) textWidth = _pdfPageSize.width - frame.origin.x; CGRect renderingRect = CGRectMake(frame.origin.x, frame.origin.y, textWidth, stringSize.height); // fill rect so we can visualize the frame CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, [UIColor lightGrayColor].CGColor); CGContextFillRect(context, renderingRect); //[myString drawInRect:renderingRect]; [myString drawWithRect:renderingRect options:NSStringDrawingUsesLineFragmentOrigin context:sdctx]; } - (void)addImage:(UIImage*)image atPoint:(CGPoint)point { CGRect imageFrame = CGRectMake(point.x, point.y, image.size.width, image.size.height); [image drawInRect:imageFrame]; } - (void)addLineWithFrame:(CGRect)frame withColor:(UIColor*)color { CGContextRef currentContext = UIGraphicsGetCurrentContext(); CGContextSetStrokeColorWithColor(currentContext, color.CGColor); // this is the thickness of the line CGContextSetLineWidth(currentContext, 2); CGPoint startPoint = frame.origin; CGPoint endPoint = CGPointMake(frame.origin.x + frame.size.width, frame.origin.y); CGContextBeginPath(currentContext); CGContextMoveToPoint(currentContext, startPoint.x, startPoint.y); CGContextAddLineToPoint(currentContext, endPoint.x, endPoint.y); CGContextClosePath(currentContext); CGContextDrawPath(currentContext, kCGPathFillStroke); } 

Есть идеи?

Экранные крышки:

Для первых двух экранов я использовал

NSAttributedString initWithData:options:documentAttributes:error:

для создания привязанной строки

В первом кадре устанавливается значение {400, 50, 300, 500}, и текст полностью обрезается.

Во втором кадре есть {400, 50, 401, 500}, текст появляется, но первые две строки текста обрезаются вверху. Если я перемещаю рамку до 20, все линии видны.

В последнем снимке экрана я просто использовал initWithString для получения атрибутной строки, и все работает так, как должно, за исключением того, что HTML не преобразуется в атрибуты.

Серая рамка - это рамка текставведите описание изображения здесьвведите описание изображения здесь

Я также очистил строку HTML, чтобы убедиться, что тэги и вызовы классов не вводили некоторые внешние атрибуты. Очищенная строка имеет те же результаты:

 <html><body><p>Landlubbers need not apply. The Sheet Bend is an essential knot to know and one of the first knots taught to new sailors. It is very fast to tie and is useful when joining two ropes of different diameters.</p><p>Also known as Becket bend (when made fast to an eye instead of a loop), the Sheet Bend is often considered one of the most essential knots and is related in structure to the bowline. If the two free ends are not on the same side of the knot, the result is a left-handed sheet bend of significantly reduced strength.</p></body></html> 

благодаря

Solutions Collecting From Web of "Проблемы с размещением NSAttributedString в PDF-файле"