2012-02-07 5 views
27

Я попытался выполнить поиск в Интернете, но не нашел четкого ответа на вопрос, поэтому пришел к вам за советом. У меня есть представление с двумя ярлыками на нем. Первая метка используется для обозначения аббревиатуры имени, 2-3 буквы. а вторая метка показывает полное имя.ios Динамические проклеивающие метки

Вопрос, который у меня есть, заключается в возможности динамически оценивать метку на основе типа шрифта, размера и длины строки? Я спрашиваю, потому что я хотел бы, чтобы второй ярлык был близок к первому, без слишком большого пробела между ними или без первой метки, перекрывающей вторую.

Причина, по которой это не все в одном ярлыке, состоит в том, что первая метка должна иметь больший шрифт и другую цветовую схему, а затем вторую метку.

Любые советы приветствуются.

+0

Перейдите по этой ссылке [ответ ограбить mayoff в] [1] Благодаря [1]: http://stackoverflow.com/questions/13206113/how-to-programmatically-change-a-uiviews-origin-as-labeled-in-xcode – umakanta

ответ

63

Вы можете рассчитать размер, в котором будет отображаться ваша строка, а затем можно установить рамку вашего UILabel до этого размера см следующего кода в качестве образца -

//Calculate the expected size based on the font and linebreak mode of your label 
CGSize maximumLabelSize = CGSizeMake(296,9999); 

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
         constrainedToSize:maximumLabelSize 
         lineBreakMode:yourLabel.lineBreakMode]; 

//adjust the label the the new height. 
CGRect newFrame = yourLabel.frame; 
newFrame.size.height = expectedLabelSize.height; 
yourLabel.frame = newFrame; 

Update -

использования sizeWithAttributes: вместо этого, который теперь принимает NSDictionary. Прохожу в паре с ключом UITextAttributeFont и ваш объект шрифта, как это:

CGSize size = [string sizeWithAttributes: 
         @{NSFontAttributeName: 
         [UIFont systemFontOfSize:17.0f]}]; 

Проверить Replacement for deprecated sizeWithFont: in iOS 7? для более подробной информации

+1

Вы, сэр, спаситель. Я все еще пытаюсь изучить API iOS и как все должно работать. – Seb

+0

@Seb - Лучшее из удачи!Счастливое программирование! – Saurabh

+0

Эта часть кода: lineBreakMode: yourLabel.lineBreakMode не для IOS 6 – Nazir

16

Это будет также сделать трюк, и будет принимать во внимание приписываемого текста

label.attributedText = attrString; 
CGSize maximumLabelSize = CGSizeMake(187,CGFLOAT_MAX); 
CGSize requiredSize = [label sizeThatFits:maximumLabelSize]; 
CGRect labelFrame = label.frame; 
labelFrame.size.height = requiredSize.height; 
label.frame = labelFrame; 
+0

Это решение гораздо более разумно. 'UILabel' должен отвечать за размер, а не за' NSString'. – Berik

+0

Что такое ** CGFLOAT_MAX ** ?? – swiftBoy

+0

Это максимальное значение, которое может хранить переменная float. – noRema

7

Кроме ответа Саурабба. У меня была такая же проблема, и вы должны добавить эту строку
[yourLabel setNumberOfLines:0];
, чтобы весь текст был показан в X строках.

+0

Да, после установки numberOfLines = 0 моя проблема решена, иначе я ударился головой о мой экран при реализации решения Saurabh. – Ans

10

'sizeWithFont:' устарел: первый раз устарел в iOS 7.0.

поэтому попробуйте sizeWithAttributes

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    label = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 300, 20)]; 

    label.backgroundColor = [UIColor blueColor]; 

    const CGFloat fontSize = 30; 
    UIFont *regularFont = [UIFont systemFontOfSize:fontSize]; 
    UIColor *foregroundColor = [UIColor blackColor]; 

    attrs = [NSDictionary dictionaryWithObjectsAndKeys: 
    regularFont, NSFontAttributeName, 
    foregroundColor, NSForegroundColorAttributeName 
    , nil]; 

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] 
    initWithString:@"Test Text" 
    attributes:attrs]; 

    [label setAttributedText:attributedText]; 
    [self.view addSubview:label]; 
} 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    CGSize expectedLabelSize = [label.text sizeWithAttributes:attrs]; // iOS 7 Code <-- 

    CGRect newFrame = label.frame; 
    newFrame.size.width = expectedLabelSize.width; 
    label.frame = newFrame; 

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc] 
               initWithString:@"Longer Test Text" 
               attributes:attrs]; 

    [label setAttributedText:attributedText]; 
} 
8

Как sizeWithFont: осуждается в прошивке 7, вам нужно использовать sizeWithAttributes (как Мавер объяснил here). Для того, чтобы упростить код, вы можете добавить метод, который можно повторно использовать, как это:

-(CGRect)rectForText:(NSString *)text 
      usingFont:(UIFont *)font 
     boundedBySize:(CGSize)maxSize 
{ 
    NSAttributedString *attrString = 
     [[NSAttributedString alloc] initWithString:text 
             attributes:@{ NSFontAttributeName:font}]; 

    return [attrString boundingRectWithSize:maxSize 
            options:NSStringDrawingUsesLineFragmentOrigin 
            context:nil]; 
} 

И использовать его

CGSize maximumLabelSize = CGSizeMake(280,9999); 
UIFont *font = [UIFont systemFontOfSize:20]; 
CGRect titleRect = [self rectForText:post.title // <- your text here 
          usingFont:font 
         boundedBySize:maximumLabelSize]; 
Смежные вопросы