2010-11-18 18 views
7

Alcuni background: volevo avere 3 pulsanti su un UIToolBar. Sono riuscito a ottenere quello centrale centrato e tutto mettendolo in uno UIToolBar stesso in un UIView.Ridimensionare un UIBarButtonItem quando il titolo diventa troppo largo

Tutto sembra proprio come dovrebbe a prescindere da quando il titolo dei pulsanti centrali diventa troppo grande. Viene quindi visualizzato sotto i pulsanti sinistro o destro.

Non riesco a ottenere la larghezza dello UIToolBar o dello UIBarButtonItems per poterle ridimensionare quando sono troppo grandi. L''UIBarButtonItem' ha una proprietà veramente bella width che mi permetterebbe di ridimensionare il controllo se è troppo grande. Ma non posso sapere quando è troppo grande!

EDIT: Ho fatto la strada dura alla fine. Calcolo la dimensione del testo e lo confronta con la dimensione massima dei pixel che ho visto sul dispositivo. Brutto ma funziona.

+ (CGFloat)calculateTextWidth:(NSString *)text 
{ 
    CGSize fullSize = [UIScreen mainScreen].applicationFrame.size; 
    UIGraphicsBeginImageContext(fullSize); 

    CGContextRef context = UIGraphicsGetCurrentContext(); 


    // calculate the text size 
    CGContextSelectFont(context, "Helvetica", 17, kCGEncodingMacRoman); 
    CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0, -1.0)); 
    CGContextSetTextDrawingMode(context, kCGTextInvisible); 

    // measure the text 
    CGPoint initialTextPosition = CGContextGetTextPosition(context); 
    CGContextShowTextAtPoint(context, 0, 0, [text cStringUsingEncoding:NSASCIIStringEncoding], text.length); 
    CGPoint finalTextPosition = CGContextGetTextPosition(context); 

    return finalTextPosition.x - initialTextPosition.x; 
} 

risposta

8

Inserire un pulsante Barra spaziatrice flessibile Elemento tra i pulsanti sinistro e destro e il pulsante centrale; ciò consentirà ai pulsanti laterali di occupare solo la larghezza di cui hanno bisogno e mantenere il pulsante centrale centrato permettendogli di crescere nello spazio circostante.

Ecco un paio di immagini da Interface Builder di qualcosa su cui stavo lavorando questa mattina che mostra l'effetto: le frecce a doppia testa sono il modo di IB di mostrare gli elementi spazio flessibile ...

Interface Builder screenshot showing toolbar with wide flexible spaces

... e lo stesso con un titolo più lungo sul pulsante centrale ...

Interface Builder screenshot showing toolbar with narrow flexible spaces

ed ecco la barra degli strumenti con pulsante di breve e lungo il centro come si è visto sul mio iPh uno 3GS:

iPhone screenshot showing toolbar with wide flexible spaces

iPhone screenshot showing toolbar with narrow flexible spaces

+1

se si imposta la larghezza UIBarButtonItem a 0.0, regola la sua larghezza automaticamente, quindi non non è necessario calcolare la larghezza. Particolarmente utile quando si utilizzano stringhe localizzate, che hanno sempre dimensioni diverse. –

2

Ecco un modo migliore per trovare la larghezza del testo:

+ (CGFloat)calculateTextWidth:(NSString *)text 
{ 
    UIFont *font = [UIFont fontWithName:@"Helvetica" size:17]; 

    return [text sizeWithFont:font].width; 
} 
Problemi correlati