2013-12-18 6 views
7

Ich erstelle eine Point-of-Sale (POS) -Erhalt und müssen Artikelnamen mit einer bestimmten Breite haben und müssen einen Preis auf der rechten Seite (wie float-right in CSS).Halbe Linie nach links und die zweite nach rechts in CoreText

Ich verwende https://github.com/FuerteInternational/FTCoreText, um den Inhalt zu erstellen. Irgendwelche Ideen, wie Sie dies erreichen können, ohne zwei Ansichten erstellen und sie übereinander legen zu müssen?

Nur um zu klären, ich brauche diese haben:

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

Also brauchen ziemlich viel ich eine Zeichenfolge auf der linken Seite zu schweben und andere Zeichenfolge auf der rechten Seite schweben ...

+0

Ich glaube nicht, dass es einen Weg gibt, dies zu tun, ohne zwei Objekte zu haben, eines mit linker Ausrichtung und eines mit rechter Ausrichtung. Sogar CSS würde zwei Objekte benötigen, um dies zu erreichen. –

+0

wir brauchen 2 Objekte entweder in HTML & CSS oder unserem nativen Code. Ich stimme @BrianShamblen zu. Die beste Sache ist für Web-Ansicht mit HTML und CSS gehen. –

Antwort

1

die einzige was ich mir vorstellen kann, ist in jeden String fe einzufügen 30 Leerzeichen nach der ersten Zeichenfolge und zuweisen wordWrap = Mitte abschneiden. Nicht so sicher, dass dies genau das ist, wonach Sie suchen.

Ich stimme mit Brian Shamblen überein, es wird ziemlich einfach mit 2 Etiketten zu tun sein.

1

Es sieht aus, als was Sie wollen, ist nicht wirklich eine zweite Spalte, die Kerntext nicht aus der Box tun kann, sondern eher ein Tabellenlayout (wie gut ol '<table>). Glücklicherweise kann das tabellarische Layout in Core Text mithilfe von Tabstopps erreicht werden. Die einzigen zwei Dinge, die Sie benötigen, sind:

  • der CHARACTER TABULATION (U+0009) Charakter,
  • und ein Absatzformat mit der richtigen Tabulatoreinstellung stoppen.

, dass diese Art und Weise getan werden kann:

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]; 

Es gibt zwei Einschränkungen:

  • Sie müssen die Breite der Ansicht wissen, wann den Absatz Stil.
  • Kerntext umschließt Zeilen nicht auf Tabulatoren, was bedeutet, dass Sie sicherstellen müssen, dass Ihr Text kurz genug ist.
0

Vielleicht könnten Sie das folgende mit nur einem UILabel pro Zeile tun:

  • definieren ein linkes Wort wie „Coffee“ und rechten wie „£ 1.45“.

  • Machen Sie eine Zeichenfolge, indem Sie das linke Wort mit einem Leerzeichen und die rechts eins verketten.

  • definieren die width und height des Rahmens, dass Sie das Etikett mit dem Zeichenfolge wollen enthalten sein, mit CGSizeMake(width, height).

  • Schätzen Sie die Größe dieses Etikett mit sizeThatFits die CGSize Einschränkungen bietet, die Sie als Argument wollen.

  • Wenn die geschätzte Breite des Etiketts ist kleiner als die erforderlichen Breite, erhöhen Sie die Größe Ihres Etiketts, durch einen Raum zu Ihrem String und wiederholen Sie hinzufügen.

In Code:

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]; 
    } 

Ich habe die oben in meinem viewDidLoad platziert und tat #import <QuartzCore/QuartzCore.h> Markierung der Grenze des UILabel zu ermöglichen.

Hier ist ein Screenshot von meinem Arbeits Code:

enter image description here

Es arbeitet für die „Milch, skinny“ Linie zu, wie die Textausrichtung des Etiketts auf NSTextAlignmentLeft gesetzt.

Hoffe, das hilft.

Verwandte Themen