Was Brents Idee betrifft, den Titel UILabel als Geschwisteransicht zu verwenden, so scheint mir das keine sehr gute Idee zu sein. Ich denke immer in Interaktion Probleme mit dem UILabel aufgrund seiner Touch-Ereignisse nicht immer durch die UIButton-Ansicht.
Auf der anderen Seite, mit einem UILabel als Unteransicht des UIButton, bin ich ziemlich beruhigt zu wissen, dass die Touch-Ereignisse immer an die UILabel's superview propagiert werden.
Ich habe diesen Ansatz gewählt und habe keines der Probleme bemerkt, die mit backgroundImage gemeldet wurden. Ich habe diesen Code in die -titleRectForContentRect: einer UIButton-Unterklasse eingefügt, aber der Code kann auch in der Zeichenroutine der UIButton-Superview platziert werden, wobei in diesem Fall alle Referenzen auf self durch die UIButton-Variable ersetzt werden müssen.
#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;
}
Ich habe mir die Zeit genommen und ein wenig mehr darüber geschrieben aquí . Dort weise ich auch auf eine kürzere Lösung hin, die allerdings nicht ganz für alle Szenarien geeignet ist und das Hacken einiger privater Ansichten beinhaltet. Auch dort können Sie eine UIButton-Subklasse bereit, verwendet werden herunterladen.