Memperluas jawaban oleh @Nick H247, saya mengalami masalah ketika awalnya garis bawahnya tidak digambar ulang ketika tombol diubah ukurannya pada rotasi; ini dapat diselesaikan dengan mengatur tombol Anda untuk menggambar kembali seperti:
myButton.contentMode = UIViewContentModeRedraw;
Ini memaksa tombol untuk menggambar ulang ketika batas berubah.
Kedua, kode asli mengasumsikan Anda hanya memiliki 1 baris teks di tombol (tombol saya membungkus 2 baris pada rotasi) dan garis bawah hanya muncul pada baris terakhir teks. Kode drawRect dapat dimodifikasi untuk menghitung terlebih dahulu jumlah baris di tombol, kemudian meletakkan garis bawah pada setiap baris daripada hanya bagian bawah, seperti:
- (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);
}
}
Semoga kode ini membantu orang lain!