Per quanto riguarda l'idea di Brent di mettere il titolo UILabel come vista fratello, non sembra a me come una buona idea. Continuo a pensare a problemi di interazione con UILabel a causa dei suoi eventi di tocco che non passano attraverso la vista di UIButton.
D'altra parte, con un UILabel come sottoview di UIButton, sono abbastanza sicuro sapendo che gli eventi di tocco verranno sempre propagati alla superview di UILabel.
Ho fatto questo approccio e non ho notato nessuno dei problemi segnalati con backgroundImage. Ho aggiunto questo codice nel -titleRectForContentRect: di una sottoclasse UIButton ma il codice può anche essere inserito nella routine di disegno della superview di UIButton, che in questo caso sostituirà tutti i riferimenti a self con la variabile di UIButton.
#define TITLE_LABEL_TAG 1234
- (CGRect)titleRectForContentRect:(CGRect)rect
{
// define the desired title inset margins based on the whole rect and its padding
UIEdgeInsets padding = [self titleEdgeInsets];
CGRect titleRect = CGRectMake(rect.origin.x + padding.left,
rect.origin.x + padding.top,
rect.size.width - (padding.right + padding.left),
rect.size.height - (padding.bottom + padding].top));
// save the current title view appearance
NSString *title = [self currentTitle];
UIColor *titleColor = [self currentTitleColor];
UIColor *titleShadowColor = [self currentTitleShadowColor];
// we only want to add our custom label once; only 1st pass shall return nil
UILabel *titleLabel = (UILabel*)[self viewWithTag:TITLE_LABEL_TAG];
if (!titleLabel)
{
// no custom label found (1st pass), we will be creating & adding it as subview
titleLabel = [[UILabel alloc] initWithFrame:titleRect];
[titleLabel setTag:TITLE_LABEL_TAG];
// make it multi-line
[titleLabel setNumberOfLines:0];
[titleLabel setLineBreakMode:UILineBreakModeWordWrap];
// title appearance setup; be at will to modify
[titleLabel setBackgroundColor:[UIColor clearColor]];
[titleLabel setFont:[self font]];
[titleLabel setShadowOffset:CGSizeMake(0, 1)];
[titleLabel setTextAlignment:UITextAlignmentCenter];
[self addSubview:titleLabel];
[titleLabel release];
}
// finally, put our label in original title view's state
[titleLabel setText:title];
[titleLabel setTextColor:titleColor];
[titleLabel setShadowColor:titleShadowColor];
// and return empty rect so that the original title view is hidden
return CGRectZero;
}
Mi sono preso il tempo e ho scritto un po 'di più su questo here. Lì, indico anche una soluzione più breve, anche se non si adatta perfettamente a tutti gli scenari e coinvolge alcune attività di pirateria privata. Inoltre, puoi scaricare una sottoclasse UIButton pronta per essere utilizzata.
'button.titleLabel .numberOfLines = 0 ' – ma11hew28
Nota per questo molto molto vecchio QA , nel moderno Xcode ** MOLTO SEMPLICE, SCEGLIERE "TESTO ATTRIBUITO" ** e poi è banale, seleziona "A capo personaggio". – Fattie
Vedere anche [risposta aggiornata] (http://stackoverflow.com/a/7832414/199364) a una domanda simile. – ToolmakerSteve