2017-08-07 13 views
1

Actuellement j'essaye de créer une fonction de messagerie dans une application.Ajuster UILabel pour aligner à droite de l'écran

J'essaie d'aligner le UILabel avec un message envoyé par l'utilisateur sur le côté droit de l'écran. Au fur et à mesure que le contenu de la largeur du texte augmentait, je voulais qu'il s'étende vers le côté gauche de l'écran, puis le saut de ligne une fois qu'il atteint une largeur maximale.

Comme vous pouvez le voir, j'ai la ligne de texte qui se casse correctement mais je ne peux pas obtenir le texte à s'asseoir correctement sur l'écran.

Ma solution au problème était de régler la largeur de la UILabel programme, mais je suis incapable de le faire pour passer de la taille fixe, j'ai dans le fichier xib de la cellule de message sortant personnalisé

pourrait quelqu'un s'il vous plaît conseiller sur la façon de faire cela?

EDIT:

Je dessinais des boîtes sur les limites actuelles du UILabel de montrer ce qu'il est en train de faire Box drawn over UILabel bounds

Ceci est le texte déplacé et le UILabel lié redessinées pour expliquer ce que je suis en train de faire . Box and text moved to show what I'm trying to do.

Capture d'écran de l'application Screen shot of messaging feature in application

+0

Avez-vous appliqué l'alignement du texte? https://developer.apple.com/documentation/uikit/uilabel/1620541-textalignment – paulvs

+0

@paulvs J'ai fait quelques modifications pour mieux expliquer le problème que j'ai. J'ai le texte aligné correctement et était mon erreur. Le problème est la taille de l'UILabel Je ne sais pas comment changer – Airagale

+0

Donc, vous voulez réduire l'étiquette pour adapter son contenu? Utilisez-vous des contraintes ou des cadres pour positionner les étiquettes? – paulvs

Répondre

0

Ici, vous êtes censé calculer la largeur de l'étiquette en fonction de la longueur du texte. Essayez cette API pour obtenir la taille de l'étiquette en fonction de la saisie de texte. CGSize yourLabelSize = [yourLabel.text sizeWithAttributes: @ {NSFontAttributeName: [UIFont fontWithName: taille de yourLabel.font: yourLabel.fontSize]}];

ou

Je suis ne serait pas en dessous de travailler dans votre cas. mais vous pouvez essayer.

Créer une étiquette dans Xcode, utilisez la disposition automatique pour définir le remplissage (la plupart du temps 4 points sur & espace de début flexible> 4 points). assurez-vous de mettre le nombre de lignes à "0" et que le texte soit aligné à droite. Ne réglez pas la taille fixe pour la largeur ici

+0

La solution que je cherche est de ne pas justifier le texte, malheureusement. – Airagale

0

enter image description here

Vous pouvez obtenir l'effet désiré en mesurant la longueur du texte et appelant et la taille pour tenir sur l'étiquette. Ensuite, vous décalez le cadre de l'étiquette (ou la super vue environnante si vous le souhaitez) sur le côté gauche ou droit de l'écran.

Voici une méthode rapide (probablement préférable de déclarer les variables maxWidth et padding ailleurs). Notez que 'w' est une variable pour la largeur de l'écran.

-(UIView *)bubbleWithText:(NSString *)text atOffset:(float)yOff isLeftAligned:(bool)leftAligned { 

    float maxWidth = 200.0f; 
    float intraCellPadding = 5.0f; 

    UILabel * label = [UILabel new]; 
    label.frame = CGRectMake(intraCellPadding, intraCellPadding, maxWidth, 0); 
    label.textColor = (leftAligned) ? [UIColor blackColor] : [UIColor whiteColor]; 
    label.text = text; 
    label.numberOfLines = 0; 
    [label sizeToFit]; 

    float width = label.frame.size.width; 
    float height = label.frame.size.height; 
    float xOff = (leftAligned) ? intraCellPadding : w-3*intraCellPadding-width; 

    UIView * bubble = [UIView new]; 
    bubble.frame = CGRectMake(xOff, yOff, width + 2 * intraCellPadding, height + 2 * intraCellPadding); 
    bubble.backgroundColor = (leftAligned) ? [UIColor greenColor] : [UIColor blueColor]; 
    bubble.layer.cornerRadius = intraCellPadding; 
    [bubble addSubview:label]; 

    return bubble; 

} 

Et vous appelleriez ci-dessus avec quelque chose comme ceci:

float interCellPadding = 10.0f; 
float yOff = 20.0f; 
bool previousWasLeft = false; 

NSArray * texts = @[@"Bacon ipsum dolor amet kevin swine ham hock, leberkas porchetta salami bacon picanha shoulder pig strip steak sirloin.", 
        @"Short loin hamburger meatloaf jowl, sirloin swine pork belly tail t-bone venison.", 
        @"Flank meatloaf prosciutto ball tip strip steak rump.", 
        @"Short piggy.", 
        @"Tri-tip ribeye drumstick andouille leberkas bacon pork chop meatball pork spare ribs chicken.", 
        @"Strip steak filet mignon tri-tip sausage, cow frankfurter bacon ribeye cupim burgdoggen shank pork belly fatback ham hock."]; 

for (NSString * text in texts){ 

    //random assignment left/right 
    //by creating a random number, either one or zero 
    //this doubles up as a boolean 
    bool alignLeft = arc4random_uniform(2); 

    //here we increment the offset 
    //depending on whether the previous bubble 
    //was on the same side or not, giving a 
    //bit more space for alternating bubbles. 
    yOff += (previousWasLeft != alignLeft) ? interCellPadding : interCellPadding/2.0f; 
    previousWasLeft = alignLeft; 

    //create the bubble and add 
    UIView * bubble = [self bubbleWithText:text atOffset:yOff isLeftAligned:alignLeft]; 
    [self.view addSubview:bubble]; //or scrollView whatever 

    //incrmeent the offset 
    yOff += bubble.frame.size.height; 

} 

C'est rapide et sale, mais montre comment mettre en œuvre ce que vous avez besoin. Pour beaucoup de cellules (ce qui est probablement ce que vous voulez), si vous suiviez la route personnalisée, vous devriez garder un oeil sur les libérer de la mémoire. Il pourrait être plus facile d'adapter une cellule UICollectionView et d'aligner simplement le contenu à l'intérieur de celle-ci.