การเพิ่มคำตอบโดย @Nick H247 ฉันประสบปัญหาเมื่อแรกขีดเส้นใต้ไม่ได้วาดใหม่เมื่อปุ่มปรับขนาดเมื่อหมุน สิ่งนี้สามารถแก้ไขได้โดยการตั้งค่าปุ่มของคุณเพื่อวาดใหม่เช่น:
myButton.contentMode = UIViewContentModeRedraw;
สิ่งนี้บังคับให้ปุ่มเพื่อวาดใหม่เมื่อขอบเขตเปลี่ยนแปลง
ประการที่สองรหัสต้นฉบับถือว่าคุณมีข้อความเพียง 1 บรรทัดในปุ่ม (ปุ่มของฉันห่อถึง 2 บรรทัดในการหมุน) และขีดเส้นใต้จะปรากฏเฉพาะในบรรทัดสุดท้ายของข้อความ โค้ด drawRect สามารถแก้ไขได้เพื่อคำนวณจำนวนบรรทัดในปุ่มก่อนจากนั้นใส่เครื่องหมายขีดเส้นใต้บนทุกบรรทัดแทนที่จะเป็นเพียงแค่ส่วนล่างเช่น:
- (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);
}
}
หวังว่ารหัสนี้จะช่วยคนอื่น!