Як наладзіць памер этыкеткі, каб адпавядаць даўжыні тэксту

I have searched the solution to this in the past QAs, but could not find the right one.
Does anyone know how to adjust aUILabel size dynamically to fit the text length?
I have uploaded the screen shot of what I don't want(1st line) and what I want(2nd line).
I'd appreciate any clues, advice or code sample. Thank you.enter image description here

15

8 адказы

What you are searching is the UILabel method sizeToFit

I can try to explain to you, but the best answer to know how to work with UILabel is that: https://stackoverflow.com/a/1054681/666479

13
дададзена

Xкод 8 і IOS-10

Гэта вельмі лёгка зрабіць з дапамогай Auto Layout. Няма неабходнасці рабіць што-небудзь у кодзе.

enter image description here

Выкарыстанне Auto Layout

Выкарыстанне Auto Layout to pin each label's top and left edges only. Don't add constraints for the width and height. The view's intrinsic content size will take care of that.

enter image description here

Вось тое, што абмежаванні выглядаць наступным чынам:

enter image description here

код

There is nothing at all special about the код. No need to use sizeToFit or anything like that.

import UIKit
class ViewController: UIViewController {

    @IBOutlet weak var labelOne: UILabel!
    @IBOutlet weak var labelTwo: UILabel!
    @IBOutlet weak var labelThree: UILabel!

    @IBAction func changeTextButtonTapped(_ sender: UIButton) {

        labelOne.text = "David"
        labelTwo.text = "met"
        labelThree.text = "her"
    }
}

нататкі

  • This answer has been retested with Xкод 8, iOS 10, and Swift 3.
  • See my other answer if you want multi-line resizing.
  • Thanks to this answer for setting me on the right track.
5
дададзена
@MyMasterPeice, я паўторна гэта прыклад у Xcode 8 і я не атрымліваю якія адсутнічаюць цяжкасцямі памылкі. Я дадаў малюнак з дакладнымі абмежаваннямі, якія я выкарыстоўваю. Паспрабуйце скапіяваць гэты дакладны прыклад. Вы не павінны атрымаць якія-небудзь памылкі.
дададзена аўтар Suragch, крыніца
@MyMasterPeice, Ok, я не выкарыстаў погляды кантэнту шмат, таму я выказаў здагадку, што гэта працуе ўсюды аднолькава. Дзякуй за ваш адказ. Я рады, што вы атрымалі яго працы.
дададзена аўтар Suragch, крыніца
дае памылку для дадатку адсутнай contrinats, як справіцца з гэтым?
дададзена аўтар KOTIOS, крыніца
@Suragch я havnt бачыў ур дэманстрацыйнае прыкладанне, але я паспрабаваў, што тое ж самае ў TextView, які змяшчаецца непасрэдна ў прадстаўленні змесціва, дзе ў гэтым растворы працаваў, але тэхніка яго падводзіць, калі абгарнуць TextView ў UIView, то гэта проста ідэальны адказ, што гэта складана пункт, які не быў згадваецца ў адказ, але той, што працаваў для мяне!
дададзена аўтар KOTIOS, крыніца
@Suragch так, але гэта можа быць адна хітрая кропка яшчэ гэтага рашэння лепш +1 :)
дададзена аўтар KOTIOS, крыніца
Калі вы карыстаецеся аўтаматычную раскладку, гэта правільны адказ. Я першапачаткова быў занепакоены не цалкам стрымліваючы макет, але гэта дакументальна працаваць такім чынам, так што павінна быць добра. developer.apple.com/library/ios/documentation/ UserExperience & ZWNJ;/& hellip;
дададзена аўтар Andy Mortimer, крыніца

Выкарыстоўвайце гэты пашыраны UILabel Клас:

//
//  UILabelExtended.h

//
//  Created by Prateek on 6/18/11.



#import 

/*  **********************************************************************************************
        This class inherit the class UILabel and extend the features of UILabel. 
    ********************************************************************************************** */
@interface UILabelExtended : UILabel {
   __unsafe_unretained id  customDelegate;
    id  objectInfo;
    SEL selector;
}

@property (nonatomic,assign) SEL selector;;
@property (nonatomic,assign) id  customDelegate;
@property (nonatomic,retain) id  objectInfo;
@end

@interface UILabel(UILabelCategory)
- (void)setHeightOfLabel;
- (void)setWidthOfLabel;
- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight;
- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth ;
@end
<�Р> UILabelExtended.m </р>
//
//  Created by Prateek on 6/18/11.

//

#import "UILabelExtended.h"


@implementation UILabelExtended
@synthesize selector,customDelegate, objectInfo;

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if(self.selector)
        if([self.customDelegate respondsToSelector:self.selector]) {
            [self.customDelegate performSelector:self.selector withObject:self];
            return;
        }
}

- (void)dealloc {

    self.customDelegate = nil;
    self.selector = NULL;
    self.objectInfo = nil;
}
@end


@implementation UILabel(UILabelCategory)

- (void)setHeightOfLabel {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, 99999) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.height = height;
    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}


- (void)setWidthOfLabel {
    UILabel* label = self;

        //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
        //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        frame.size.width = width+5;
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}

- (void)setHeightOfLabelWithMaxHeight:(float)maxHeight {
    UILabel* label = self;

    //get the height of label content
    CGFloat height = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, maxHeight) lineBreakMode:NSLineBreakByWordWrapping].height;
    //set the frame according to calculated height
    CGRect frame = label.frame;

    if([label.text length] > 0) {
        if (height > maxHeight) {
            frame.size.height = maxHeight;
        }
        else {
            frame.size.height = height;
        }

    } 
    else {
        frame.size.height = 0;
    }
    label.frame = frame;
}

- (void)setWidthOfLabelWithMaxWidth:(float)maxWidth  {
    UILabel* label = self;

    //get the height of label content
    CGFloat width = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(99999, label.bounds.size.height) lineBreakMode:NSLineBreakByWordWrapping].width;
    //set the frame according to calculated height
    CGRect frame = label.frame;
    if([label.text length] > 0) {

        if (width > maxWidth) {
            frame.size.width = maxWidth;
        }
        else {
            frame.size.width = width;
        }
    } 
    else {
        frame.size.width = 0;
    }
    label.frame = frame;
}
@end
<�Р> Метады Выкарыстанне:   1) ўсталяваць тэкст UILabel   2) [yourLBLObj setHeightOfLabel]; або [yourLBLObj setWidthOfLabel];   Яна будзе аўтаматычна ўсталёўваць шырыню або вышыню ў адпаведнасці з тэкстам.
3
дададзена
Вялікі дзякуй мой сябар. Калі ласка, дайце мне ведаць, калі ў вас ёсць якія-небудзь іншыя пытанні. І, калі ласка, ацаніце мой анс
дададзена аўтар Prateek Prem, крыніца
Вялікі дзякуй! Мне спадабалася ваша дэталёвае кадаваньне. Гэта вельмі карысна.
дададзена аўтар boochan224, крыніца

вы атрымліваеце проста вылічыць UILabel шырыня для памеру радка, паспрабуйце гэты просты код для набору UILabel памер

  //Single line, no wrapping;
    CGSize expectedLabelSize = [string sizeWithFont:yourFont];
// you get width,height in expectedLabelSize;
//expectedLabelSize.width,expectedLabelSize.height
3
дададзена
Дзякуючы. Я вазьму вашыя парады таксама.
дададзена аўтар boochan224, крыніца

паспрабуйце гэта

        NSString *text1 = [NSString stringWithFormat:@"%@",commentText];
        CGSize constraint1 = CGSizeMake(280, 2000);
        CGSize size1 = [text1 sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:constraint1 lineBreakMode:UILineBreakModeWordWrap];

        UILabel *lblComment = [[UILabel alloc] initWithFrame:CGRectMake(posx,posy,size1.width,size1.height)] ;
        lblComment.lineBreakMode = UILineBreakModeWordWrap;
        lblComment.numberOfLines = size1.height/15;
        [lblComment setFont:[UIFont systemFontOfSize:12]];
        lblComment.text = text1;
        lblComment.tag = shareObjC.userId;
            [lblComment setNeedsDisplay]
1
дададзена

У цяперашні час я працую на IOS-8 і ёсць невялікія змены я зрабіў у адказ @Suragch (трэба выкарыстоўваць аўтаматычную раскладку, каб зрабіць гэтую працу)

<�Моцны> Ніжэй крок і скрыншот у выніку:

  1. Змесціце TextView ўнутры UIView, а не непасрэдна ўнутры змесціва гледжання у раскадроўкі
  2. Адключыць пракруткі TextView з раскадроўкі
  3. Дадайце Leading і верхнія абмежаванні, як я дадаў для прагляду ў ніжэй здымак экрана (Слізгальны абмежаванне не з'яўляецца абавязковым, але я дадаў) </літый>

Там няма неабходнасці дадаваць код у борзды гэта можа быць зроблена ў самой раскадроўкі.

Result : enter image description here

0
дададзена

Усё, што вам трэба проста пакласці 2 радкі кода

lbl1.numberOfLines = 0
    lbl1.sizeToFit()

Ён будзе кіраваць шырынёй этыкеткі ў адпаведнасці з яго зместам

Спадзяюся, што гэта дапамагае іншым :)

0
дададзена

Вы можаце выкарыстоўваць гэты кавалак кода для шырыні вылічваюць этыкеткі і ўсталяваць яго

   CGSize expectedLabelSize = [name sizeWithFont:yourfont constrainedToSize:maximumLabelSize]; 

// вы можаце атрымаць шырыню вышыню шырыні ад expectedLabelSize і ўсталяваць адпаведна

0
дададзена