[text] UIButton에서 텍스트 밑줄

누구나 UIButton의 제목에 밑줄을 긋는 방법을 제안 할 수 있습니까? 사용자 정의 유형의 UIButton이 있고 제목에 밑줄을 표시하고 싶지만 인터페이스 빌더는 옵션을 제공하지 않습니다.

버튼의 글꼴 옵션을 선택할 때 인터페이스 빌더에서 없음, 단일, 이중, 색상을 선택하는 옵션을 제공하지만 버튼의 제목에 대한 변경 사항은 없습니다.

도움을 주셔서 감사합니다.



답변

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


답변

밑줄에 인터페이스 빌더를 사용하려면 다음을 수행해야합니다.

  • 소중한 것으로 변경
  • 속성 관리자에서 텍스트를 강조 표시합니다
  • 마우스 오른쪽 버튼을 클릭하고 글꼴을 선택한 다음 밑줄을 선택하십시오.

IB를 사용한 밑줄

다른 사람이 만든 동영상
https://www.youtube.com/watch?v=5-ZnV3jQd9I


답변

iOS6부터는 NSAttributedString을 사용하여 훨씬 유연한 방식으로 밑줄 (및 기타 문자열로 지원되는 항목)을 수행 할 수 있습니다.

NSMutableAttributedString *commentString = [[NSMutableAttributedString alloc] initWithString:@"The Quick Brown Fox"];

[commentString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0, [commentString length])];

[button setAttributedTitle:commentString forState:UIControlStateNormal];

참고 : 이전 답변과 완전히 다른 솔루션으로 이것을 다른 답변으로 추가했습니다.

편집 :
이상하게도 (최소한 iOS8에서는) 첫 번째 문자에 밑줄을 쳐야합니다. 그렇지 않으면 작동하지 않습니다!

해결 방법으로 첫 번째 문자에 밑줄이 그어진 색으로 설정하십시오!

    // underline Terms and condidtions
    NSMutableAttributedString* tncString = [[NSMutableAttributedString alloc] initWithString:@"View Terms and Conditions"];

    // workaround for bug in UIButton - first char needs to be underlined for some reason!
    [tncString addAttribute:NSUnderlineStyleAttributeName
                      value:@(NSUnderlineStyleSingle)
                      range:(NSRange){0,1}];
    [tncString addAttribute:NSUnderlineColorAttributeName value:[UIColor clearColor] range:NSMakeRange(0, 1)];


    [tncString addAttribute:NSUnderlineStyleAttributeName
                      value:@(NSUnderlineStyleSingle)
                      range:(NSRange){5,[tncString length] - 5}];

    [tncBtn setAttributedTitle:tncString forState:UIControlStateNormal];


답변

인터페이스 빌더 자체에서이를 수행 할 수 있습니다.

  1. 속성 관리자를 선택하십시오
  2. 제목 유형을 일반에서 속성으로 변경

여기에 이미지 설명을 입력하십시오

  1. 적절한 글꼴 크기 및 텍스트 정렬 설정

여기에 이미지 설명을 입력하십시오

  1. 그런 다음 제목 텍스트를 선택하고 밑줄이 그어진 글꼴을 설정하십시오

여기에 이미지 설명을 입력하십시오


답변

기여 문자열로 매우 간단합니다.

설정된 속성으로 사전을 작성하고 속성이 지정된 문자열에 적용하십시오. 그런 다음 uibutton에서 타당한 문자열을 uilabel의 attibutedtitle 또는 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];


답변

다음은 Swift 1.2에서 작동하는 기능입니다.

func underlineButton(button : UIButton, text: String) {

    var titleString : NSMutableAttributedString = NSMutableAttributedString(string: text)
    titleString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: NSMakeRange(0, count(text.utf8)))
    button.setAttributedTitle(titleString, forState: .Normal)
}

Swift 3.0 확장 업데이트 :

extension UIButton {
    func underlineButton(text: String) {
        let titleString = NSMutableAttributedString(string: text)
        titleString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSMakeRange(0, text.characters.count))
        self.setAttributedTitle(titleString, for: .normal)
    }
}


답변

Nick의 대답은이 작업을 수행하는 훌륭하고 빠른 방법입니다.

drawRect그림자 에 대한 지원을 추가했습니다 .

버튼 제목에 텍스트 아래에 그림자가 있으면 Nick의 답변이 고려되지 않습니다.

여기에 이미지 설명을 입력하십시오

그러나 그림자의 높이만큼 밑줄을 아래로 이동할 수 있습니다.

CGFloat descender = self.titleLabel.font.descender;
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGFloat shadowHeight = self.titleLabel.shadowOffset.height;
descender += shadowHeight;

그러면 다음과 같은 것을 얻을 수 있습니다 :

여기에 이미지 설명을 입력하십시오