2013-12-18 4 views
7

Я создаю квитанцию ​​точки продажи (POS) и вам нужно иметь наименования позиций с определенной шириной и нужно иметь цену справа (как float-right в CSS).Выравнивание половины строки влево и вправо справа в CoreText

Я использую https://github.com/FuerteInternational/FTCoreText для создания контента. Любые идеи, как достичь этого, не создавая двух взглядов и не помещая их друг на друга?

Просто уточнить, мне нужно, чтобы это:

Coffee     £1.45 
    milk, skinny 
Danish Pastry   £1.75 
Coca Cola    £1.10 
Full English Bfst  £12.50 

Так довольно много мне нужна строка, которая будет плавать на левом и другой строке плавающей справа ...

+0

Я не думаю, что есть способ сделать это, не имея двух объектов, один с выравниванием слева и один с правильным выравниванием. Даже для CSS потребуется два объекта для достижения этого. –

+0

нам нужны 2 объекта либо в HTML и CSS, либо в нашем родном коде. Я согласен с @BrianShamblen. Лучше всего искать веб-интерфейс с HTML и CSS. –

ответ

1

только вещь, о которой я могу думать, вставляет в каждую строку fe 30 пробелов после первой строки и присвоение слова Wrap = truncate middle. Не уверен, что это именно то, что вы ищете.

Я согласен с Брайаном Шамбленом, это будет довольно легко сделать с 2 ярлыками.

1

Похоже, что вы не на самом деле не второй столбец, который Core Text не может сделать из коробки, а скорее табличный макет (например, хороший ol '<table>). К счастью, табличный макет можно получить в Core Text с помощью табуляторов. Единственные 2 вещи, которые вам нужны:

  • CHARACTER TABULATION (U+0009) характер,
  • и стиль абзаца с закладкой правильной остановки установки.

Это можно сделать так:

NSString *string = @"Coffee\t£1.45\n milk, skinny\nDanish Pastry\t£1.75\nCoca Cola\t£1.10\nFull English Bfst\t£12.50"; 
CGFloat width = 200; 

NSArray *tabs = @[CFBridgingRelease(CTTextTabCreate(kCTTextAlignmentRight, width, NULL))]; 
CTParagraphStyleSetting setting = {kCTParagraphStyleSpecifierTabStops, sizeof(tabs), &tabs}; 
CTParagraphStyleRef paragraphStyle = CTParagraphStyleCreate(&setting, 1); 
NSDictionary *attributes = @{CFBridgingRelease(kCTParagraphStyleAttributeName): CFBridgingRelease(paragraphStyle)}; 
NSAttributedString *attributedString = [[NSAttributedString alloc] initWithString:string attributes:attributes]; 

Есть два предостережения:

  • Вы должны знать ширину зрения при создании стиля абзаца.
  • Основной текст не будет обертывать линии на вкладках, что означает, что вы должны убедиться, что ваш текст достаточно короткий, чтобы соответствовать.
0

Может быть, вы могли бы сделать следующее с только один UILabel на линии:

  • Определить левое слово, как «Кофе» и право один, как «1,45 £».

  • Сделайте строку, объединив левое слово с пробелом и правой.

  • Определить width и height кадра, который вы хотите ярлык с этой строки, которая должна содержаться в, с CGSizeMake(width, height).

  • Оцените размер этой этикетки с использованием sizeThatFits предоставления CGSize ограничения, которые вы хотите в качестве аргумента.

  • Если оценочная ширина метки меньше требуемой ширины , увеличьте размер вашей метки, добавив пробел в строку и повторите.

В коде:

NSArray *leftWords = @[@"Coffee", @" milk, skinny", @"Danish Pastry", @"Coca Cola", @"Full English Bfst"]; 
    NSArray *rightWords = @[@"£1.45", @"", @"£1.75", @"£1.10", @"£12.50"]; 

    CGFloat xOffset = 5; 
    CGFloat yOffset = 60; 
    CGFloat labelHeight = 44; 
    CGFloat labelWidth = 300; 

    for (int i = 0; i < leftWords.count; i ++) { 

     UILabel *aLabel = [[UILabel alloc] initWithFrame:CGRectMake(xOffset, yOffset + i * labelHeight, labelWidth, labelHeight)]; 
     aLabel.numberOfLines = 1; 
     aLabel.textAlignment = NSTextAlignmentLeft; 
     aLabel.layer.borderColor = [UIColor greenColor].CGColor; 
     aLabel.layer.borderWidth = 1.0f; 

     NSString *leftWord = [leftWords objectAtIndex:i]; 
     NSString *rightWord = [rightWords objectAtIndex:i]; 
     NSMutableString *spaces = [[NSMutableString alloc] initWithString:@" "]; 

     const CGFloat MAX_WIDTH = 310; 
     CGSize maxLabelSize = CGSizeMake(MAX_WIDTH, CGFLOAT_MAX); 

     CGSize expectedSize = CGSizeMake(0, 0); 
     CGFloat expectedWidth = 0.0; 

     NSString *phrase = @""; 
     do { 
      phrase = [NSString stringWithFormat:@"%@%@%@", leftWord, spaces, rightWord]; 
      aLabel.text = phrase; 
      expectedSize = [aLabel sizeThatFits:maxLabelSize]; 
      expectedWidth = expectedSize.width; 
      // Increase spaces 
      [spaces appendString:@" "]; 

     } while (expectedWidth < MAX_WIDTH); 

     CGRect frame = aLabel.frame; 
     frame.size = expectedSize; 
     aLabel.frame = frame; 

     [self.view addSubview:aLabel]; 
    } 

я поместил выше в моем viewDidLoad и сделал #import <QuartzCore/QuartzCore.h>, чтобы маркировка границы UILabel.

Вот скриншот моего рабочего кода:

enter image description here

Он работает на «молоко, тощая» линия тоже, как выравнивание текста метки устанавливаются в NSTextAlignmentLeft.

Надеюсь, это поможет.

Смежные вопросы