2013-12-18 65 views
7

我正在创建一个销售点(POS)收据,并且需要具有一定宽度的物料名称,并且需要在右侧有一个价格(如中的float-right)。在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

我们需要HTML&CSS或我们的本地代码中的2个对象。我同意@BrianShamblen。最好的事情是用HTML和CSS进行web查看。 –

回答

1

唯一我能想到的东西是插入每个字符串中第一个字符串后面有30个空格,并指定wordWrap = truncate middle。不太确定,这正是你正在寻找的。

我同意布赖恩Shamblen它很容易做与2个标签。

1

它看起来像你想要的不是真正的第二列,核心文本不能开箱即用,而是表格式的布局(比如好的'<table>)。幸运的是表格式布局可以通过使用制表符停止在核心文本中实现。你唯一需要的两件事情是:

  • CHARACTER TABULATIONU+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,并要与 字符串标签要包含在,与CGSizeMake(width, height)框架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

希望这会有所帮助。

相关问题