// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (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();
UIColor *colr;
// set to same colour as text
if (self.isHighlighted || self.isSelected) {
colr=self.titleLabel.highlightedTextColor;
}
else{
colr= self.titleLabel.textColor;
}
CGContextSetStrokeColorWithColor(contextRef, colr.CGColor);
CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y + textRect.size.height + descender);
CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + textRect.size.height + descender);
CGContextClosePath(contextRef);
CGContextDrawPath(contextRef, kCGPathStroke);
}
//Override this to change the underline color to highlighted color
-(void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
// [self setNeedsDisplay];
}
17 回答
UIUnderlinedButton.h
UIUnderlinedButton.m
要使用界面构建器加下划线,必须:
将其更改为属性
突出显示“属性”检查器中的文本
右键单击,选择“字体”,然后选择“下划线”
Video someone else made https://www.youtube.com/watch?v=5-ZnV3jQd9I
从iOS6开始,现在可以使用NSAttributedString以更灵活的方式执行下划线(以及其他任何归因于字符串支持的内容):
注意:将此添加为另一个答案 - 因为它与我之前的解决方案完全不同 .
Edit: 奇怪(至少在iOS8中)你必须为第一个字符加下划线,否则它不起作用!
所以作为一种解决方法,将第一个char设置为带有明确颜色的下划线!
您可以在界面构建器本身中执行此操作 .
选择属性检查器
将 Headers 类型从普通更改为属性
使用属性字符串非常简单
创建具有set属性的字典并应用于属性字符串 . 然后,您可以将uibutton中的属性字符串设置为attibutedtitle或uilabel中的attributestext .
这是我的功能,适用于Swift 1.2 .
更新Swift 3.0扩展:
尼克的答案是一个很好的,快速的方法来做到这一点 .
我在
drawRect
中添加了对阴影的支持 .如果您的按钮 Headers 在文本下方有阴影,则Nick的回答不会考虑:
但你可以将下划线向下移动阴影的高度,如下所示:
然后你会得到这样的东西:
对于Swift 3,可以使用以下扩展名:
扩展了@Nick H247的答案,我遇到了一个问题,首先当按钮在旋转时调整大小时,下划线没有重绘;这可以通过将按钮设置为重绘来解决:
这会强制按钮在边界更改时重绘 .
其次,原始代码假设您在按钮中只有1行文本(我的按钮在旋转时包含2行),并且下划线仅出现在文本的最后一行 . 可以修改drawRect代码以首先计算按钮中的行数,然后在每一行而不是底部添加下划线,如下所示:
希望这段代码可以帮助别人!
在迅速
当按下加下划线的按钮时,如何处理案例?在这种情况下,按钮的文本颜色会根据突出显示的颜色而改变,但线条保留原始颜色 . 假设正常状态下的按钮文字颜色是黑色,那么它的下划线也会有黑色 . 按钮的突出显示颜色为白色 . 按住按钮可将按钮文本颜色从黑色更改为白色,但下划线颜色保持黑色 .
我相信这是XCode中字体编辑器中的一些错误 . 如果使用界面构建器,则必须将 Headers 从Plain更改为Attributed,打开TextEdit创建带下划线的文本并将其复制粘贴到XCode中的文本框
尼克H247的答案,但斯威夫特方法:
You can use this code to add underline with spacing in button.
1 - Interface builder reference
2 - using described code
用于@NickH247's的Swift 3版本,自定义下划线颜色,线宽和间隙: