2013-12-18 111 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

希望這會有所幫助。

相關問題