iPhone - UILabel, содержащий текст с несколькими шрифтами одновременно

Веб-разработка в языке Common LISP является и эффективной и забавной.

Некоторые примеры:

сл - КОМУ позволяет Вам писать HTML, не забывая закрывающего тэга никогда снова.

Weblocks позволяет Вам определить формы декларативно со встроенной проверкой:

(defview signup (:type form :caption "Sign up")
  (username :satisfies #'valid-username)
  (password :present-as dual-password :parse-as dual-password)
  (receive-newsletter-p :present-as checkbox :parse-as predicate))

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

распространенность статьи является невероятно простой альтернативой SQL.

Довольно много людей использует эти технологии в последнее время для важнейших приложений - с успехом.

самые важные проекты открытого исходного кода CL на самом деле имеют превосходную общественную поддержку.

63
задан Tom van Zummeren 13 September 2009 в 10:02
поделиться

2 ответа

Используйте два UILabel IBOutlet, каждый с разным форматом (шрифт / цвет / и т. Д.), По вашему желанию. Переместите второй по первому в зависимости от того, где заканчивается текст первого. Вы можете получить это через sizeWithFont: forWidth: lineBreakMode:

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

Обновление: см. Ответ @Akshay ниже. Начиная с iOS6, UILabel может содержать NSMutableAttributedString. Когда я писал это, этого не было.

18
ответ дан 24 November 2019 в 16:08
поделиться

Обновление: если у вас iOS 6+, используйте UILabel.attributedText - иначе ....

Я создал этот базовый подкласс UIView для поддержки аналогичных функций.

Список вещей, которые он не поддерживает , длиннее, чем он делает, но в основном он позволяет вам управлять единственной строкой UILabels и форматировать каждую по своему усмотрению. Это позволяет, например, вставлять текст другого цвета в середине строки и избегать использования тяжелого UIWebView.

Я создаю эти объекты, помещая объект UIView в свой интерфейс (с помощью Interface Builder) и устанавливая тип объекта в IB равным MultipartLabel. Затем в коде я вызываю updateNumberOfLabels и различные селекторы setText по мере необходимости.

//  MultipartLabel.m
//  MultiLabelLabel
//
//  Created by Jason Miller on 10/7/09.
//  Copyright 2009 Jason Miller. All rights reserved.
//

#import "MultipartLabel.h"

@interface MultipartLabel (Private)
- (void)updateLayout;
@end

@implementation MultipartLabel

@synthesize containerView;
@synthesize labels;

-(void)updateNumberOfLabels:(int)numLabels;
{
 [containerView removeFromSuperview];
 self.containerView = nil;

 self.containerView = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)] autorelease];
 [self addSubview:self.containerView];
 self.labels = [NSMutableArray array];

 while (numLabels-- > 0) {
  UILabel * label = [[UILabel alloc] initWithFrame:CGRectZero];
  [self.containerView addSubview:label];
  [self.labels addObject:label];
  [label release];
 }

 [self updateLayout];
}

-(void)setText:(NSString *)text forLabel:(int)labelNum;
{
 if( [self.labels count] > labelNum && labelNum >= 0 )
 {
  UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
  thisLabel.text = text;
 }

 [self updateLayout];
}

-(void)setText:(NSString *)text andFont:(UIFont*)font forLabel:(int)labelNum;
{
 if( [self.labels count] > labelNum && labelNum >= 0 )
 {
  UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
  thisLabel.text = text;
  thisLabel.font = font;
 }

 [self updateLayout];
}

-(void)setText:(NSString *)text andColor:(UIColor*)color forLabel:(int)labelNum;
{
 if( [self.labels count] > labelNum && labelNum >= 0 )
 {
  UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
  thisLabel.text = text;
  thisLabel.textColor = color;
 }

 [self updateLayout];
}

-(void)setText:(NSString *)text andFont:(UIFont*)font andColor:(UIColor*)color forLabel:(int)labelNum;
{
 if( [self.labels count] > labelNum && labelNum >= 0 )
 {
  UILabel * thisLabel = [self.labels objectAtIndex:labelNum];
  thisLabel.text = text;
  thisLabel.font = font;
  thisLabel.textColor = color;
 }

 [self updateLayout];
}

- (void)updateLayout {

 int thisX = 0;

 // TODO when it is time to support different sized fonts, need to adjust each y value to line up baselines

 for (UILabel * thisLabel in self.labels) {
  CGSize size = [thisLabel.text sizeWithFont:thisLabel.font
         constrainedToSize:CGSizeMake(9999, 9999)
          lineBreakMode:thisLabel.lineBreakMode];
  CGRect thisFrame = CGRectMake( thisX, 0, size.width, size.height );
  thisLabel.frame = thisFrame;

  thisX += size.width;
 }
}


- (void)dealloc {
 [labels release];
 labels = nil;

 [containerView release];
 containerView = nil;

    [super dealloc];
}


@end
18
ответ дан 24 November 2019 в 16:08
поделиться