2013-12-18 15 views
7

Sto creando una ricevuta POS (Point-of-Sale) e ho bisogno di avere nomi di articoli con una certa larghezza e di avere un prezzo a destra (come float-right in CSS).Allineamento della semiretta a sinistra e la seconda a destra in CoreText

Sto usando https://github.com/FuerteInternational/FTCoreText per creare il contenuto. Qualche idea su come ottenere ciò senza dover creare due viste e posizionarle l'una sull'altra?

tanto per chiarire, ho bisogno di avere questo:

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

quindi praticamente ho bisogno di una stringa di galleggiare sulla sinistra e altra stringa che galleggia sulla destra ...

+0

Non penso che ci sia un modo per farlo senza avere due oggetti, uno con allineamento a sinistra e uno con allineamento a destra. Persino i CSS richiederebbero due oggetti per raggiungere questo obiettivo. –

+0

abbiamo bisogno di 2 oggetti in HTML e CSS o nel nostro codice nativo. Sono d'accordo con @ BrianShamblen. La cosa migliore è andare per la visualizzazione Web con HTML e CSS. –

risposta

1

L'unica cosa posso pensare sta inserendo in ogni stringa fe 30 spazi dopo la prima stringa e assegnazione di wordWrap = truncate middle. Non sono sicuro che questo sia esattamente quello che stai cercando.

Sono d'accordo con Brian Shamblen, è piuttosto facile farlo con 2 etichette.

1

Sembra che ciò che si desidera non sia realmente una seconda colonna, che Core Text non può fare fuori dalla scatola, ma piuttosto un layout tabellare (come il buon vecchio <table>). Fortunatamente il layout tabellare può essere raggiunto in Core Text usando i punti di tabulazione. Le uniche 2 cose che servono sono:

  • il carattere CHARACTER TABULATION (U+0009),
  • e uno stile di paragrafo con la scheda corretta ferma impostazione.

che può essere fatto in questo modo:

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

Ci sono due accorgimenti:

  • È necessario conoscere la larghezza della vista quando si crea lo stile di paragrafo.
  • Il testo principale non si sovrapporterà alle interruzioni di tabulazione, il che significa che è necessario assicurarsi che il testo sia abbastanza corto da adattarsi.
0

Forse si potrebbe fare quanto segue con una sola UILabel per riga:

  • definire una parola di sinistra come "Caffè" e un diritto uno come "£ 1.45".

  • Creare una stringa concatenando la parola sinistra con uno spazio e la destra di .

  • Definire il width e height della cornice che si desidera che l'etichetta con quella stringa da inserire nei, con CGSizeMake(width, height).

  • Stimare le dimensioni di tale etichetta utilizzando sizeThatFits fornendo i vincoli CGSize che si desidera come argomento.

  • Se la larghezza stimata dell'etichetta è inferiore alla larghezza richiesta, aumentare la dimensione dell'etichetta, aggiungendo uno spazio alla stringa e ripetere.

in codice:

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

ho messo sopra nel mio viewDidLoad e ha fatto #import <QuartzCore/QuartzCore.h> per consentire la marcatura del bordo della UILabel.

Ecco uno screenshot del mio codice di lavoro:

enter image description here

Si lavora per il "latte magro" linea troppo come l'allineamento del testo dell'etichetta è impostato su NSTextAlignmentLeft.

Spero che questo aiuti.

Problemi correlati