2011-02-10 7 views

risposta

2

sono riuscito a farlo funzionare in una categoria di UIButton:

@interface UIButton (ExpandsVertically) 

- (CGSize)sizeThatFits:(CGSize)size; 

@end 

@implementation UIButton (Expandable) 

- (CGSize)sizeThatFits:(CGSize)size { 

    // for the width, I subtract 24 for the border 
    // for the height, I use a large value that will be reduced when the size is returned from sizeWithFont 
    CGSize tempSize = CGSizeMake(size.width - 24, 1000); 

    CGSize stringSize = [self.titleLabel.text 
         sizeWithFont:self.titleLabel.font 
         constrainedToSize:tempSize 
         lineBreakMode:UILineBreakModeWordWrap]; 

    return CGSizeMake(size.width - 24, stringSize.height); 
} 

@end 

Se qualcuno usa questo assicuratevi di impostare:

myButton.titleLabel.lineBreakMode = UILineBreakModeWordWrap; 
2

Si consiglia di esaminare lo UIKit Additions to NSString documentation che include i metodi per la misurazione dei caratteri vincolati a una larghezza specifica o alle dimensioni della casella.

Quando si imposta il titolo del tasto, è possibile misurare la stringa usando il sizeWithFont: forWidth: lineBreakMode: metodo, per esempio, e aggiornare il telaio della vostra tasto in base alla dimensione restituita (possibilmente consentendo un certo imbottitura intorno ai bordi).

Spiacente, non ho un esempio specifico per te.

+0

Mi hai condotto nella giusta direzione ... grazie! – TigerCoding

31

Assicurarsi di impostare il testo sul pulsante in questo modo :

[myButton setTitle:@"my title" forState:UIControlStateNormal]; 

... e [myButton sizeToFit] dovrebbe funzionare come un fascino.

+3

Funziona per me. Grazie. – Prazi

+15

Penso che questo potrebbe non funzionare correttamente sui pulsanti con tipo = personalizzato – marmor

5

[button sizeToFit] non ha funzionato per me, ma ho trovato un modo utilizzando IB solo (Xcode 4.5):

  1. Cliccare sulla UIButton
  2. nel trascinamento Size ispettore content hugging-1 (sia orizzontale e verticale)
  3. trascinare compression resistance-1.000 (per entrambi)
  4. sotto del UIButton constraints click sul Width e cambiare priority-250
  5. fare lo stesso per Altezza
  6. È possibile utilizzare il s insetUIButton' per controllare padding per sinistra/destra/alto/basso
+0

Hai provato a utilizzare l'opzione? Se utilizzo l'inset, sembra che l'autolayout non tenga conto del calcolo della larghezza prevista, quindi anche se la larghezza del pulsante aumenta ma non è sufficiente per inserire testo + left right inset – saurabh

0

Sto affrontando un problema simile, aveva larghezza limitata per il mio pulsanti e voleva che crescessero verticalmente, a seconda della quantità di testo che avrei dato loro. Ho finito con una soluzione semplice, sulla base di quello che ho imparato nella documentazione di Apple (https://developer.apple.com/library/ios/documentation/UserExperience/Conceptual/AutolayoutPG/ImplementingView/ImplementingView.html)

ho sottoclasse UIButton e sovrascritto due funzioni:

- (void)setBounds:(CGRect)bounds { 
    if (!CGRectEqualToRect(bounds, self.bounds)) { 
     [self invalidateIntrinsicContentSize]; 
    } 
    [super setBounds:bounds]; 
} 

- (CGSize)intrinsicContentSize { 
    // 
    CGSize size; 

    self.titleLabel.frame = CGRectMake(self.titleLabel.frame.origin.x, 
      self.titleLabel.frame.origin.y, 
      self.frame.size.width - self.contentEdgeInsets.left - self.contentEdgeInsets.right - self.titleEdgeInsets.left - self.titleEdgeInsets.right, 
      0); 
    size = [self.titleLabel sizeThatFits:self.titleLabel.frame.size]; 
    size = CGSizeMake(size.width, size.height + 20); 

    return size; 
} 

Cosa succede in pratica qui è che il pulsante invalida le sue dimensioni intrinseche (solo quando i set di limiti sono in realtà nuovi - questo è per prevenire un loop infinito), e quando il sistema chiede la dimensione del contenuto intrinseco, lo ricalcolo in base alla larghezza del pulsante. L'altezza extra 20px è per l'imbottitura. Ho provato molti altri modi, ma poiché il mio layout è tutto basato su AutoLayout, volevo qualcosa che non dovessi aggiornare ogni volta che il dispositivo ruotasse o meno. Questo semplicemente funziona.

Buona fortuna! Z.

Problemi correlati