6
votes

Comment déterminer quelle partie d'un nstring s'inscrit dans un rect?

Ceci concerne le formatage PDF à l'aide de graphiques de base. Mais il pourrait s'agir de tout type de pagination lorsqu'il s'agit d'imprimer une chaîne sur deux pages.

Je dois répandre une chaîne sur plusieurs pages. Pour des chaînes plus petites, ce n'est pas un problème réel. Pour ceux que j'utilise, les extensions Uikit NSstring Taillewithfont Pour déterminer, que le texte intégral correspond à la page en cours ou non. Si c'est le cas, je l'imprime avec drawinrect et s'il ne le déplace pas à la page suivante.

fonctionne bien mais ne convient pas aux chaînes plus longues. Dans mon application, les chaînes individuelles (fournies par l'utilisateur) peuvent même être plus longues qu'une page complète.

Lorsqu'il y a une page complète ou un espace restant d'une page donnée, comment puis-je déterminer exactement quelle partie de la nstring peut être affichée dans ce record donné afin que je puisse couper et imprimer la chaîne restante (ou moins une partie de celui-ci) à la page suivante?

J'ai pensé à une alternative. Cela attire le texte intégral dans un contexte graphique hors écran, puis coupez l'image créée en tranches qui entrent dans l'espace libre sur les pages. Mais si je fais cela, j'ai besoin de placer la ligne de coupe exactement entre les lignes de texte. Et franchement, je ne suis pas sûr de savoir comment comprendre où le texte contenant du graphique peut être réduit en toute sécurité dans deux (ou plus) parties sans couper une ligne de texte dans son milieu.

J'espère que je me suis exprimé compréhensible et que quelqu'un vient à la rescousse.


3 commentaires

+1, enfin quelqu'un articulant clairement cet énigme confondant.


Je doute que vous voulez vraiment faire cela en utilisant votre alternative ... s'il s'agissait d'une imagerie bitmap, d'accord, mais vous ne voulez sûrement pas que votre texte soit inclus dans votre PDF en tant que bitmap ...


@mkl, tu as raison. C'est pourquoi je demande. Cependant, à la fin, j'ai besoin d'un PDF qui imprime parfaitement la mise en forme sur papier. Une idée?


3 Réponses :


0
votes

Que diriez-vous d'utiliser une approximation? XXX PRE>

Appelez-le comme: P>

NSString *str = @"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin eros"
    "nulla, commodo eget fringilla nec, varius nec ligula. Donec pulvinar eros sed diam"
    "euismod scelerisque. Mauris imperdiet leo at elit vulputate ullamcorper. Nullam"
    "condimentum odio a lacus tempus ac pretium justo tincidunt.";

UIFont *font = [UIFont systemFontOfSize:16.0]; // or whatever
UIView *displayView = // the view in which you intend to present the string

NSInteger length = [self lengthOfString:str thatFitsIntoView:displayView usingFont:font];
NSString *displayedString = [str substringToIndex:length];


6 commentaires

Oui, si je ne trouve rien de mieux, je devrais aller chercher une approximation. Une approximation devra prendre en compte la ligne / mot en prise en compte. Je pourrais alors même "phrase d'emballage". Ce qui signifie que je n'aurais coupé la corde seulement après des arrêts complets ".", Des points-virgules, etc., puis testez la partie de la chaîne s'il convient vraiment au rect. Mais cela dépendrait de l'utilisateur faisant une contribution raisonnable. Votre suggestion échouerait si l'utilisateur entre un nombre important de CR / LF. J'ai besoin de quelque chose de plus précis. Quelques NumberObrsoSofstring: Fittorect: Avecfont: LinebreakMode: ou.


@Hermannklecker Cela fait exactement cela. Renvoie le nombre de caractères qui correspondent. Vous pouvez affiner le résultat en démarrant une itération à partir de de longueur vers la page 0 et testez si la sous-chaîne jusqu'à ce que l'indice s'adapte.


J'apprécie votre aide. Mais je doute que cela fait exactement chapeau. Il détermine d'abord la hauteur du bloc de texte à la manière habituelle. Ensuite, il vérifie si le bloc de texte correspondrait à la page. Bien jusqu'à présent. Mais ensuite, cela prend simplement la relation de la hauteur de texte complète à la taille de l'espace libre de la page et multiplie cette relation avec le nombre de caractères et renvoie ce résultat. (suite ...)


Même si la chaîne contient de nombreux "A" seulement, 11 rangées d'AAAA ... ". Disons 50 A dans chaque ligne et 550 A est au total, de sorte que le texte représente 11 lignes de "AAAA ..." Votre solution Woult puis renvoyez 275. Mais le numéro 275 est au milieu de la ligne 6 et seulement le La moitié supérieure de la ligne 6 entrerait dans la page. Voir? Et cela ne prend même aucun message en prise en compte ou des lignes que SEY est composée de CR / LF, ce qui bousillerait totalement cette calcule si elles ne sont pas prises en compte.


@Hermannklecker C'est pourquoi j'ai suggéré la méthode impliquant une certaine itération pour un réglage précis. De cette façon, vous pourriez être sûr de récupérer le texte qui convient vraiment.


Oui, une approche plus étroite de proximité pourrait faire l'affaire.



2
votes

Pour le cas général où vous n'utilisez pas de texte de base, vous pouvez simplement continuer à ajouter des caractères à la chaîne jusqu'à ce que sa taille soit trop grande. Cela peut être assez rapide et si vous avez des cordes vraiment énormes (comme vous le semblez), vous pouvez accélérer avec une simple recherche binaire.

Si vous utilisez du texte de base, créez simplement un CTFRAME de la zone que vous souhaitez remplir, puis demandez-la pour la plage utilisée avec CTFRADEGETVISLESTRINGRANGE () .


1 commentaires

Rob et Peter, je vais certainement jeter un oeil au texte de base. Merci.



2
votes

dans le texte de base, il y a Une fonction très pertinente , dont le dernier argument (un pointeur à un CFRANGE) est défini comme suit:

FITRANGE
En retour, contient la plage de la chaîne qui correspond à la taille contrainte.

3 commentaires

Toutes mes excuses pour la réponse tardive. Je devais mettre fin à ce projet juste après avoir posé cette question en raison des priorités. Maintenant que je continue de continuer à finir, j'ai constaté que votre suggestion, ou le lien, fonctionne parfaitement correctement. Merci pour l'indice.


Salut Hermann Je suis également confronté au même problème. Mais je crée le fichier PDF à l'aide des méthodes uikit et en utilisant Favoris HI dans mon application, je dois générer un fichier PDF en obtenant des données à partir d'une génération Array.pdf à partir d'une méthode Uikit comme Drawrect et à l'aide de UIGraphicsbeginpdfcontextOfile (TheFilePath, CGRRECTERO, néant); UigraphiesBEGINPDFPageWithInfo (0, 0, pagesize.Width, pagesize.Height), .Here i cannnot capable de décider de la longueur de chaîne pouvant correspondre à n'importe quelle ligne et la chaîne restante d'une autre rangée dans la page suivante.Veuillez pouvez-vous expliquer comment vous Plage d'ajustement d'occasion.


@Naresh: Je pense que vous devriez poser une nouvelle question qui explique ce que vous faites et le problème que vous rencontrez plus en détail.