Bei der Erweiterung der Antwort von @Nick H247 trat ein Problem auf, bei dem zunächst die Unterstreichung nicht neu gezeichnet wurde, wenn die Größe der Schaltfläche beim Drehen geändert wurde. Dies kann gelöst werden, indem Sie Ihre Schaltfläche so einstellen, dass sie wie folgt neu gezeichnet wird:
myButton.contentMode = UIViewContentModeRedraw;
Dies zwingt die Schaltfläche zum Neuzeichnen, wenn sich die Grenzen ändern.
Zweitens ging der ursprüngliche Code davon aus, dass Sie nur 1 Textzeile in der Schaltfläche hatten (meine Schaltfläche wird beim Drehen in 2 Zeilen umgebrochen), und die Unterstreichung wird nur in der letzten Textzeile angezeigt. Der drawRect-Code kann geändert werden, um zuerst die Anzahl der Zeilen in der Schaltfläche zu berechnen und dann jede Zeile und nicht nur die untere Zeile zu unterstreichen:
- (void) drawRect:(CGRect)rect {
CGRect textRect = self.titleLabel.frame;
// need to put the line at top of descenders (negative value)
CGFloat descender = self.titleLabel.font.descender;
CGContextRef contextRef = UIGraphicsGetCurrentContext();
// set to same colour as text
CGContextSetStrokeColorWithColor(contextRef, self.titleLabel.textColor.CGColor);
CGSize labelSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font
constrainedToSize:self.titleLabel.frame.size
lineBreakMode:UILineBreakModeWordWrap];
CGSize labelSizeNoWrap = [self.titleLabel.text sizeWithFont:self.titleLabel.font forWidth:self.titleLabel.frame.size.width lineBreakMode:UILineBreakModeMiddleTruncation ];
int numberOfLines = abs(labelSize.height/labelSizeNoWrap.height);
for(int i = 1; i<=numberOfLines;i++) {
// Original code
// CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y + textRect.size.height + descender + PADDING);
//
// CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + textRect.size.height + descender);
CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y + (labelSizeNoWrap.height*i) + descender + PADDING);
CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + (labelSizeNoWrap.height*i) + descender);
CGContextClosePath(contextRef);
CGContextDrawPath(contextRef, kCGPathStroke);
}
}
Hoffe, dieser Code hilft jemand anderem!