Underlining text in UIButton

后端 未结 18 1810
终归单人心
终归单人心 2020-11-29 15:56

Can anyone suggest how to underline the title of a UIButton ? I have a UIButton of Custom type, and I want the Title to be underlined, but the Interface Builder does not pr

相关标签:
18条回答
  • 2020-11-29 16:09

    You can use this code to add underline with spacing in button.

    • When I tried to draw an underline from interface builder. It look like below image.

    1 - Interface builder reference

    • And after using below code I achieved the result as I wanted.

    2 - using described code

    public func setTextUnderline()
        {
            let dummyButton: UIButton = UIButton.init()
            dummyButton.setTitle(self.titleLabel?.text, for: .normal)
            dummyButton.titleLabel?.font = self.titleLabel?.font
            dummyButton.sizeToFit()
    
            let dummyHeight = dummyButton.frame.size.height + 3
    
            let bottomLine = CALayer()
            bottomLine.frame = CGRect.init(x: (self.frame.size.width - dummyButton.frame.size.width)/2, y: -(self.frame.size.height - dummyHeight), width: dummyButton.frame.size.width, height: 1.0)
            bottomLine.backgroundColor = self.titleLabel?.textColor.cgColor
            self.layer.addSublayer(bottomLine)
        }
    
    0 讨论(0)
  • 2020-11-29 16:12

    UIUnderlinedButton.h

    @interface UIUnderlinedButton : UIButton {
    
    }
    
    
    + (UIUnderlinedButton*) underlinedButton;
    @end
    

    UIUnderlinedButton.m

    @implementation UIUnderlinedButton
    
    + (UIUnderlinedButton*) underlinedButton {
        UIUnderlinedButton* button = [[UIUnderlinedButton alloc] init];
        return [button autorelease];
    }
    
    - (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);
    
        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);
    }
    
    
    @end
    
    0 讨论(0)
  • 2020-11-29 16:12

    The Swift 5.0 version that works as of September 2019 in Xcode 10.3:

    extension UIButton {
      func underlineText() {
        guard let title = title(for: .normal) else { return }
    
        let titleString = NSMutableAttributedString(string: title)
        titleString.addAttribute(
          .underlineStyle,
          value: NSUnderlineStyle.single.rawValue,
          range: NSRange(location: 0, length: title.count)
        )
        setAttributedTitle(titleString, for: .normal)
      }
    }
    

    To use it, set your button title first with button.setTitle("Button Title", for: .normal) and then call button.underlineText() to make that title underlined.

    0 讨论(0)
  • 2020-11-29 16:12

    I believe it's some bug in font editor in XCode. If you using interface builder you have to change title from Plain to Attributed, open TextEdit create underlined text and copy-paste to textbox in XCode

    0 讨论(0)
  • 2020-11-29 16:14

    It is very simple with attributed string

    Creates a dictionary with set attributes and apply to the attributed string. Then you can set the attributed string as attibutedtitle in uibutton or attributedtext in uilabel.

    NSDictionary *attrDict = @{NSFontAttributeName : [UIFont
     systemFontOfSize:14.0],NSForegroundColorAttributeName : [UIColor
     whiteColor]};
     NSMutableAttributedString *title =[[NSMutableAttributedString alloc] initWithString:@"mybutton" attributes: attrDict]; 
    [title addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0,[commentString length])]; [btnRegLater setAttributedTitle:title forState:UIControlStateNormal];
    
    0 讨论(0)
  • 2020-11-29 16:16
    // 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];
    }
    
    0 讨论(0)
提交回复
热议问题