8
votes

Comment puis-je dessiner une chaîne sans marges dans une vue?

J'ai du mal à dessiner un Nsattributedstring code> sans margins autour de lui à sa vue. Voici mon code:

NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:72.0f]};
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"Hello"
                                                             attributes:attributes];
[string drawWithRect:rect
             options:NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesDeviceMetrics
             context:nil];


8 commentaires

En ce qui concerne la question 2: Stackoverflow.com/Questtions/3429671/...


Pourquoi la deuxième image est-elle juste? Il y a de l'espace après le "O" et de l'espace en dessous de toutes les lettres. Il me semble que vous n'avez pas défini clairement, même pour vous-même, ce que vous êtes après.


Aussi, est l'arrière-plan coloré crucial? Parce que si les antécédents étaient clairs, personne ne saurait que les limites de la vue sont, et la question tomberait.


@matt - Notez que pour l'article 1, je me soucie de la droite et du bas. Je me suis clairement défini à moi-même ce que je veux, permettez-moi de savoir comment je peux clarifier la question. Je ne serai pas en train d'utiliser de fond coloré, mais j'ai besoin du texte dessiné pour être aligné avec d'autres éléments à l'écran, de sorte que les limites de la vue sont importantes.


Puis au lieu d'éliminer l'espace, il me semble que votre question devrait être simplement: "Où est le coin supérieur gauche du texte dessiné?" Sachant que cela vous permettrait de positionner le texte. Mais encore une fois, cela dépend d'une définition réaliste et significative du "haut rang gauche", et il ne me semble pas que vous avez une telle définition à l'esprit.


Ou peut-être que la question devrait être de savoir comment aligner les étiquettes les unes avec les autres. C'est en fait assez facile, car ils ont des lignes de base intégrées qui peuvent être apportées pour s'aligner automatiquement. Dans ce cas, bien sûr, vous devriez penser au bas à gauche du texte. Vraiment, vous feriez mieux de poser une question basée sur le problème pratique que vous essayez de résoudre, plutôt qu'une question qui suppose un tas de choses que vous n'avez pas besoin de supposer (et ce qui me semble que vous n'avez pas clarifié dans votre propre esprit à l'avance).


D'après ce que vous avez dit, vous commencez que la question est que les polices viennent toutes avec des valeurs ascendantes et dérivantes qui forcent un peu d'espace blanc. Après avoir essayé, ce n'est pas si facile à sous-classer ou d'étendre l'uifont pour les remplacer. Pour une police donnée, vous pouvez utiliser la taille des lettres majuscules et l'ascension pour éliminer un offset Y pour éliminer l'espace blanc supérieur et le descendant pour éliminer le décalage inférieur. Vous devriez alors être capable d'utiliser DrawatPoint pour dessiner décalage pour vous donner la chasse à gauche et au sommet. Changez la taille de la vue pour faire face en bas et à droite.


Pouvez-vous élaborer plus sur ce que vous essayez exactement d'atteindre? Que devriez-vous arriver à des personnages qui descendent en dessous de la ligne de base? Accents sur les capitales allant au-dessus de la hauteur du capuchon? Jetez un coup d'œil à Cette infographie . Quelles dimensions voulez-vous calculer et aligner?


3 Réponses :


2
votes

Utiliser CORETEXT, CTLINEGETTYPOGROGOGOGOGOGOREDS () est probablement ce que vous recherchez. Je n'ai pas utilisé cela moi-même. Le code suivant démontre l'idée (dessin "Bonjour" à un UIView personnalisé sans marge de haut / gauche). xxx


6 commentaires

Pouvez-vous expliquer comment je pourrais utiliser cela pour faire ce que je veux?


Pour éviter les malentendus, pouvez-vous poster une image de démontrer ce que vous entendez exactement par «pas de margins»?


Et si c'est "EE"? Notez qu'il y a un espace de premier plan.


Bonne question. Je serais bien avec tout comportement dans ce cas.


Cela ne produit pas le comportement que je veux.


Uppote parce que tu es le plus proche. J'ai pu obtenir ce que je voulais utiliser ctlineGetImageBounds. Je posterai une réponse avec mon code quand j'ai une chance.



0
votes

Essayez ceci.

float fonsize = 30.0;
NSDictionary *attributes = @{NSFontAttributeName: [UIFont systemFontOfSize:fonsize]};
NSAttributedString *string = [[NSAttributedString alloc] initWithString:@"HelloWorld"
                                                             attributes:attributes];
CGSize stringBoundingBox = [string.string sizeWithFont:[UIFont systemFontOfSize:fonsize]];
CGRect rect = CGRectMake(50, 50, stringBoundingBox.width,stringBoundingBox.height);

UILabel* lbl = [[UILabel alloc] initWithFrame:rect];
lbl.backgroundColor = [UIColor yellowColor];
lbl.attributedText = string;
[self.view addSubview:lbl];


2 commentaires

Merci, je vais donner cela un coup de feu quand j'ai une chance.


Cela ne produit pas le comportement que je veux.



4
votes

Vous pouvez obtenir la hauteur, la largeur des valeurs vectorielles à l'aide de CareText: xxx

afin que vous puissiez obtenir le rect. Mais la marge supérieure n'est pas incorrecte


0 commentaires