2014-10-30 11 views
6

Ho un pulsante che ha due testi diversi nello stato selezionato e nello stato normale, Quando cambio stato del pulsante programmaticamente il pulsante non viene ridimensionato in modo che il testo non appaia correttamente, che è il modo migliore per fai questo con l'autolayout?UIButton larghezza dinamica con autolayout

So che un modo impostazione sbocco al vincolo di larghezza di UIButton e cambiare manualmente ma cerco di modo migliore

+1

http://stackoverflow.com/questions/4135032/ios-uibutton-resize-according-to-text-length – Alfa

+0

Già letto che ma non aiuta molto :( – Abhishek

+0

Mentre si modifica lo stato del pulsante, fare la dimensione del pulsante grande abbastanza che la stringa possa venire facilmente al suo interno, ma prima di memorizzare gentilmente il centro del pulsante nella variabile quindi utilizzare il metodo di adattamento e quindi fornire nuovamente lo stesso centro al pulsante. – Alfa

risposta

-2

Prova questo

CGSize maxSize = CGSizeMake(btn.bounds.size.width, CGFLOAT_MAX); 
    CGSize textSize1 = [btn.titleLabel.text sizeWithFont:btn.titleLabel.font constrainedToSize:maxSize]; 

btn.frame=CGSizeMake(10,10,textSize1.width,30); 
+2

Generalmente non abbiamo impostato il frame in autolayout – Abhishek

0

È possibile utilizzare il tasto di default in questo modo:

UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem]; 
[button setTranslatesAutoresizingMaskIntoConstraints:NO]; 
[button setTitle:@"Normal" forState:UIControlStateNormal]; 
[button addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside]; 
[button setTitle:@"Selected" forState:UIControlStateSelected]; 
[self.view addSubview:button]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[button]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(button)]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[button]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(button)]]; 

Se si utilizza il pulsante personalizzato, il modo più semplice a cui riesco a pensare è sottoclasse UIButton e aggiungere la propria UILabel personalizzata all'interno. Qui è il mio codice funzione di ciò che intendo:

@interface CustomButton : UIButton 
{ 
    NSString* _normalTitle; 
    NSString* _selectedTitle; 
} 
@property UILabel* customLabel; 

@end 

@implementation CustomButton 

@synthesize customLabel=_customLabel; 

- (instancetype)init; 
{ 
    self = [super init]; 
    if (self) { 
    [self setBackgroundColor:[UIColor greenColor]]; 

    _customLabel = [UILabel new]; 
    [_customLabel setTextColor:[UIColor whiteColor]]; 
    [_customLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [self addSubview:_customLabel]; 

    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[_customLabel]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_customLabel)]]; 
    [self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_customLabel]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_customLabel)]]; 
} 
return self; 
} 
- (void)setTitle:(NSString *)title forState:(UIControlState)state; 
{ 
    if (state == UIControlStateNormal) { 
     _normalTitle = title; 
    } else if (state == UIControlStateSelected) { 
     _selectedTitle = title; 
    } 
    [self setSelected:[self isSelected]]; 
} 
- (void)setSelected:(BOOL)selected; 
{ 
    [super setSelected:selected]; 
    if (selected) { 
     [_customLabel setText:_selectedTitle]; 
    } else { 
     [_customLabel setText:_normalTitle]; 
    } 
} 

@end 
0

Quando si crea vincoli assegnarlo a variabili

@property (nonatomic, strong)NSLayoutConstraint *viewConstraintTop; 
self.viewConstraintTop = [Your Constraint];//Initial state 

al momento del check rubinetto pulsante se è selezionato o not.Remove i vincoli e riapplicare vincoli del caso .

[self.viewConstraintTop autoRemove]; 
self.viewConstraintTop = [Your Constraint]; 
3

appena dicendo [button invalidateIntrinsicContentSize];, che dovrebbe fare quello che vi aspettate di fare.

+0

Questo mi ha salvato la giornata - Grazie! – MrBr