UILabel оправдывает влево и вправо

У меня есть UILabel (какао-сенсорный фреймворк), и я хочу, чтобы правый и левый оправдывали его текст. как следствие, он растянет текст внутри.

Пример: например, если бы у меня был этот текст « Пока сэкономленные затраты на физическое производство и доставку » он выглядел бы следующим образом:

"While the saved" "costsof" "physical" "manufacturing" "and shipping" 

как вы можете видеть правое и левое оправдание …

как я могу это достичь ???

большое спасибо

  • я сожалею, что мне пришлось поставить два qoutations, чтобы опубликовать вопрос.

Вы должны использовать мой класс OHAttributedLabel .

В нем есть все необходимое для отображения NSAttributedString , включая оправдание левого, центрального, правого … и оправдано , и действительно прост в использовании.

Вы можете найти его здесь на github . См. Пример кода, который также показывает, как изменить выравнивание текста.

 // suppose that label is an IBOutlet to an OHAttributedLabel (subclass oh UILabel) label.textAlignment = UITextAlignmentJustify; // and that's all, OHAttributedLabel does everything needed for you! 

(Примечание: UITextAlignmentJustify – это константа, определенная в заголовках OHAttributedLabel, которая соответствует соответствующей константе CoreText для выравнивания выравнивания. Эта константа не существует в SDK от Apple)


[EDIT] iOS6 SDK

Начиная с iOS6 SDK, UITextAlignmentJustify больше не работает и генерирует сбой во время выполнения. Теперь вы должны установить выравнивание текста вашего NSAttributedString непосредственно, вместо использования свойства textAlignment метки.

Использование UIWebView может быть медленным, поэтому, если это проблема, то CoreText – это путь.

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

Этот код не полностью оправдывает последнюю строку. Не уверен, что вы можете получить это бесплатно в CoreText.

файл .h

 // // SmartLabel.h // #import <UIKit/UIKit.h> #import <CoreText/CoreText.h> // needed for CTFontRef, CTFontCreateWithName @interface SmartLabel : UIView { NSMutableAttributedString* _pgSmartString; } @property (nonatomic, retain) NSMutableAttributedString* smartString; - (void) setText: (NSString*) string; - (void) formatString; @end 

И файл .m

 // // SmartLabel.m // #import "SmartLabel.h" @implementation SmartLabel @synthesize smartString = _pgSmartString; - (void)dealloc { [_pgSmartString release]; [super dealloc]; } - (id)initWithFrame:(CGRect)frame; { if ((self = [super initWithFrame:frame])) { [self setBackgroundColor: [UIColor clearColor]]; } return self; } - (void)drawRect:(CGRect)rect { CGContextRef graphicsContext = UIGraphicsGetCurrentContext(); CGContextSetTextMatrix(graphicsContext, CGAffineTransformIdentity); // turns things right way up CGContextTranslateCTM(graphicsContext, 0, self.bounds.size.height); CGContextScaleCTM(graphicsContext, 1.0, -1.0); CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)[self smartString]); CGRect bounds = [self bounds]; bounds.origin.x = bounds.origin.x + 8; bounds.size.width = bounds.size.width - 16; CGMutablePathRef path = CGPathCreateMutable(); CGPathAddRect(path, NULL, bounds); CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [[self smartString] length]), path, NULL); CFRelease(path); CTFrameDraw(frame, graphicsContext); CFRelease(frame); CFRelease(framesetter); } - (void) setText: (NSString*) string; { NSMutableAttributedString* attributedString = [[NSMutableAttributedString alloc] initWithString:string]; [self setSmartString:attributedString]; [attributedString release]; [self formatString]; } - (void) formatString; { CTTextAlignment alignment = kCTJustifiedTextAlignment; // could put different alignments here CGFloat paragraphSpacing = 11.0; CGFloat paragraphSpacingBefore = 0.0; CGFloat firstLineHeadIndent = 0.0; CGFloat headIndent = 0.0; CTParagraphStyleSetting altSettings[] = { { kCTParagraphStyleSpecifierAlignment, sizeof(CTTextAlignment), &alignment}, { kCTParagraphStyleSpecifierFirstLineHeadIndent, sizeof(CGFloat), &firstLineHeadIndent}, { kCTParagraphStyleSpecifierHeadIndent, sizeof(CGFloat), &headIndent}, { kCTParagraphStyleSpecifierParagraphSpacing, sizeof(CGFloat), &paragraphSpacing}, { kCTParagraphStyleSpecifierParagraphSpacingBefore, sizeof(CGFloat), &paragraphSpacingBefore}, }; CTParagraphStyleRef style; style = CTParagraphStyleCreate( altSettings, sizeof(altSettings) / sizeof(CTParagraphStyleSetting) ); if ( style == NULL ) { NSLog(@"*** WARNING *** Unable To Create CTParagraphStyle in apply paragraph formatting" ); return; } [[self smartString] addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)style,(NSString*) kCTParagraphStyleAttributeName, nil] range:NSMakeRange(0,[[self smartString] length])]; CFRelease(style); UIFont* boldFont = [UIFont boldSystemFontOfSize:12.0]; CTFontRef boldCoreTextFontReference = CTFontCreateWithName ((CFStringRef)[boldFont fontName],[boldFont pointSize], NULL); [[self smartString] addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:(NSObject*)boldCoreTextFontReference,(NSString*) kCTFontAttributeName, nil] range:NSMakeRange(0,[[self smartString] length])]; } @end 

И чтобы использовать, что-то вроде этого:

 SmartLabel* smartLabel = [[SmartLabel alloc] initWithFrame:CGRectMake(20, 120, 90, 140.0)]; [[self window] addSubview:smartLabel]; [smartLabel setText:@"While the saved costs of physical manufacturing and shipping"]; [smartLabel release]; 

Это очень легко после выпуска IOS 6. Используйте это

 //build a style for justification NSMutableParagraphStyle *stringStyle=[[NSMutableParagraphStyle alloc]init]; [stringStyle setAlignment:NSTextAlignmentJustified]; //build a string with the particular paragraph style NSMutableAttributedString* yourString=[[NSMutableAttributedString alloc]init]; [yourString addAttribute:NSParagraphStyleAttributeName value:stringStyle range:NSMakeRange(0, [yourString length])]; //and here you go UILabel *yourLabel; yourlabel.attributedText=yourString; 

С iOS 6 вы можете использовать NSMutableAttributedString для этого,

 NSMutableAttributedString* attrStr = [[NSMutableAttributedString alloc] initWithData:[@"Your String value" dataUsingEncoding:NSUTF8StringEncoding] options:@{NSDocumentTypeDocumentAttribute: NSHTMLTextDocumentType, NSCharacterEncodingDocumentAttribute: [NSNumber numberWithInt:NSUTF8StringEncoding]} documentAttributes:nil error:nil]; NSRange rangeOfTitle = NSMakeRange(0,[attrStr length]); [attrStr addAttribute: NSFontAttributeName value:[UIFont fontWithName:@"Calibri" size:19.0]range:rangeOfTitle]; myLabel.attributedText = attrStr; NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init]; [style setLineSpacing:10]; style.lineBreakMode = NSLineBreakByWordWrapping; style.alignment = NSTextAlignmentJustified; [attrStr addAttribute:NSParagraphStyleAttributeName value:style range:NSMakeRange(0, myLabel.text.length)]; myLabel.attributedText = attrStr; 

Идеальное решение – использовать NSMutableParagraphStyle

 NSMutableParagraphStyle *paragraphStyles = [[NSMutableParagraphStyle alloc] init]; paragraphStyles.alignment = NSTextAlignmentJustified; //justified text paragraphStyles.firstLineHeadIndent = 1.0; NSDictionary *attributes = @{NSParagraphStyleAttributeName: paragraphStyles}; NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString: YourString attributes: attributes]; YourLabel.attributedText = attributedString; 

Это так называемое «полное обоснование», но не поддерживается системой UILabel (которая имеет только «выравнивания» – влево, вправо и в центре). Если вы хотите этого, вам придется самостоятельно его подстроить, создав элемент управления с помощью CoreText или аналогичного.

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

Следующее работает как быстрое исправление, но обратите внимание, что для чего-либо большего, чем черный текст, вам понадобится стилизация или css.

(От: Обоснованное выравнивание в UITextView – iPhone )

Я пришел к решению, которое работает. Прежде всего, вам нужно будет изменить UITextView и вместо этого использовать UIWebView.

  Details.h @interface Details : UIViewController { IBOutlet UIWebView *descripcion; } @property (nonatomic, retain) UITextView *descripcion; Then, load your UIWebView as follows: Details.m [descripcion loadHTMLString:[NSString stringWithFormat:@"<div align='justify'>%@<div>",YOUR_TEXT] baseURL:nil]; 
  • Усечение части текста в UILabel
  • Используя AutoLayout, как я могу сохранить UILabel в том же месте, когда панель навигации исчезнет?
  • Моделирование поведения UILabel на OSX
  • Добавление пробела / дополнения в UILabel
  • UILable numberoflines и размер шрифта автоматически устанавливаются во время увеличения времени
  • UILabel с NSAttributedString - это отсечение содержимого
  • Как отображать эможи и специальные символы в UIlabel и UItextviews?
  • Как показать запрос GET в Label
  • Верхний выравнивающий текст разных размеров в пределах UILabel
  • Установка вертикального выравнивания усеченных хвостов для NSAttributedString с NSTextAttachment
  • iPhone, как определить, будет ли UILabels показывать усеченный текст?
  • Interesting Posts

    UITextField не получает ввод с клавиатуры

    Действия кнопки в подвью, имеющие ошибку «непризнанный селектор, отправленный в экземпляр»

    границы imageView всегда равны 240

    Как пройти prepareForSegue: объект

    Cocos Denshion: воспроизведение звукового эффекта в синхронизации с музыкой

    Создание программных ограничений компоновки

    Как добавить аудио вход в AVCaptureSession и разрешить другим приложениям воспроизводить музыку в фоновом режиме

    UITableViewCell AutoLayout с несколькими ярлыками

    self.tableView.reloadData () не работает в Swift

    как проверить UIView и UIImageView коснулся или нет в iphone sdk?

    как быстро записывать видеоизображение?

    iCloud Core Data "нет документа по URL"

    Можно ли вручную отрегулировать время экспозиции для камер iOS?

    AVPlayer был освобожден, а наблюдатели с ключевыми значениями все еще были зарегистрированы с ним

    Декларация «u_char» должна быть импортирована из модуля «Darwin.POSIX.sys.types», прежде чем она понадобится

    Давайте будем гением компьютера.