Problem bei drawRect: mit NSAttributedString

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Problem bei drawRect: mit NSAttributedString

    Hi,

    ich versuche gerade eine PDF-Klasse zu schreiben welche im Content (vorerst) aus HTMl besteht und außerdem die Möglichkeit anbieten soll Texte im Kopf und Fußbereich unterzubringen.
    Das ganze habe ich über eine XML-Datei gemacht die für jedes Element das man zeichnen möchte einen Eintrag besitzt.
    Die ganze Logik habe ich implementiert, mein PDF wird gezeichnet und gespeichert.
    Im Header & Footer soll das ganze so dynamisch wie möglich funktionieren,sodass auch Mehrzeiliger Text ausgegeben wird.

    Alle Texte für Kopf & Fuß werden durch folgenden Code gejagt:

    Quellcode

    1. NSMutableParagraphStyle *paragraphStyle = [NSMutableParagraphStyle new];
    2. paragraphStyle.maximumLineHeight = fontSize;
    3. paragraphStyle.minimumLineHeight = fontSize;
    4. paragraphStyle.alignment = NSTextAlignmentLeft;
    5. paragraphStyle.lineBreakMode = NSLineBreakByTruncatingTail;
    6. paragraphStyle.baseWritingDirection = NSWritingDirectionLeftToRight;
    7. NSDictionary *attrs = [NSDictionary dictionaryWithObjectsAndKeys:
    8. NSForegroundColorAttributeName, textColor,
    9. NSFontAttributeName, font,
    10. NSBackgroundColorAttributeName, [UIColor lightGrayColor],
    11. NSParagraphStyleAttributeName, paragraphStyle,
    12. nil];
    13. NSString *text = [values valueForKey:[item objectForKey:kPropertyForKey]];
    14. NSAttributedString* attrString = [[NSAttributedString alloc] initWithString:text attributes:attrs];
    15. [attrString drawInRect:drawRect];
    Alles anzeigen


    Die Einträge in der XML sehen u.a. so aus:

    Quellcode

    1. <header height="5">
    2. <text key="vorname" x="0" y="0" width="20" height="auto" color="333333" fontSize="15.0" fontFamily="Bodoni 72 Oldstyle" />
    3. <text key="nachname" x="3" y="0" width="20" height="auto" color="#00ff00" fontSize="12.0" fontFamily="Optima" />
    4. <text key="fulltext" x="3" y="2" width="5" height="2" color="#00ff00" fontSize="12.0" />
    5. </header>


    Das Problem ist das hinter dem Key "fulltext" ein Text steht der länger als eine Zeile ist und dann zeichnet drawRect einfach gar nichts mehr, laut Dokumentation müsste er aber so viel zeichnen wie er in den Bereich reinbekommt.

    Ich hab schon probiert den AttributedString in ein Label zu packen, dann zeichnet er tatsächlich auch alles, aber er berücksichtigt keinerlei Formatierungen mehr :(

    Kann mir jemand helfen?
  • Also ich habe jetzt folgendes gemacht.
    Ich habe die anderen 2 Einträge aus der XML (die ohne Probleme funktionieren) rausgenommen und das Rect mit Grün gefüllt (Danke für den Tipp - kannte ich noch gar nicht :) )

    Mit folgenden Werten funktioniert es (Zumindest zeichnet er Text & Fläche):
    Das Dictionary das die Texte zu den keys enthält sieht so aus:

    Quellcode

    1. NSMutableDictionary *header = [NSMutableDictionary dictionaryWithObjectsAndKeys:
    2. @"Max", @"vorname",
    3. @"Mustermann", @"nachname",
    4. @"Ich bin ein etwas längerer Text der ", @"fulltext",
    5. nil];


    Das PDF sieht dann so aus wie auf dem screen1.jpg (Der Fließtext in der Mitte ist der HTML Content).


    Mit folgenden Werten geht es nicht (Gezeichnet wird nur das grün):

    Quellcode

    1. NSMutableDictionary *header = [NSMutableDictionary dictionaryWithObjectsAndKeys:
    2. @"Max", @"vorname",
    3. @"Mustermann", @"nachname",
    4. @"Ich bin ein etwas längerer Text der hoffentlich automatisch bis zum Ende des Dokumenetes fließt und dann umbricht - Ein Seitenumbruch wird und soll allerdings nicht passieren", @"fulltext",
    5. nil];


    Das PDF sieht dann aus wie auf screen2.jpg

    Was mich allerdings wundert ist das auch wenn ich zum Text aus dem Beispiel1 noch das "hoffentlich" mit nehmen (vom Auge würde ich sagen das Wort passt da locker noch hin) dann verschwindet der Text wieder komplett :(

    die variable drawRect hat immer folgende Ausgabe: {{121.03937, 92.692917}, {396.8504, 113.38583}} - ich denke das entspricht auch dem was ich sehe.


    Mit drawAtPoint funktioniert es übrigens nur passiert es dann natürlich das der Text einfach bis zum Ende des PDF's läuft und dan abgeschnitten ist - also für Text der Umbrechen kann ist drawAtPoint eigentich unbrauchbar...

    Kleiner Nachtrag:
    Mit DrawAtPoint geht es auch nur so lange im Text kein Umbruch ist, wenn ich also \n in meinen Test einfüge is der gesamte Text wieder verschwunden...

    Hatnoch jemand eine Idee, langsam verzweifel ich :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von H1990 ()

  • MCDan schrieb:


    Alternativ kannst Du noch Core Text oder Text Kit verwenden.


    Yippie - es geht :)
    Ein kleiner aber Wertvoller Tipp, mit folgendem Code habe ich es hinbekommen:

    Quellcode

    1. CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString( (CFAttributedStringRef)attrString);
    2. CGMutablePathRef rectPath = CGPathCreateMutable();
    3. CGPathAddRect(rectPath, NULL, CGRectMake(drawRect.origin.x, -drawRect.origin.y, drawRect.size.width, drawRect.size.height));
    4. // block frame
    5. CTFrameRef rectFrame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), rectPath, NULL);
    6. // flip the coordinate system
    7. CGContextRef context = UIGraphicsGetCurrentContext();
    8. CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    9. CGContextTranslateCTM(context, 0, drawRect.size.height);
    10. CGContextScaleCTM(context, 1.0, -1.0);
    11. // draw the textblock
    12. CTFrameDraw(rectFrame, context);
    13. // fix the flipped coordinate system for next use
    14. CGContextSetTextMatrix(context, CGAffineTransformIdentity);
    15. CGContextTranslateCTM(context, 0, drawRect.size.height);
    16. CGContextScaleCTM(context, 1.0, -1.0);
    Alles anzeigen


    Das Ergebnis - siehe Anhang (Sind natürlich alles Testobjekte)

    Außerdem habe ich noch folgendes gefunden, was darauf hin deutet das es ein iOS 7.0.4 Bug ist:
    stackoverflow.com/questions/19…tedstring-does-not-appear

    Ich hatte schon fast nichtmehr an eine Lösung geglaubt :D vielen Dank MCDan