Swift의 밑줄 버튼 텍스트


80

UIButton이 있습니다. 인터페이스 빌더에서 제목을 '속성'으로 설정했습니다. Swift의 코드에서 제목에 밑줄을 긋는 방법은 무엇입니까?

@IBOutlet weak var myBtn: UIButton!

이 버튼의 touchUpInside 이벤트에서 호출되는 함수를 만들었습니다.

var attributedString = NSMutableAttributedString(string:"new text")
    var attrs = [
        NSFontAttributeName : UIFont.systemFontOfSize(19.0),
        NSForegroundColorAttributeName : UIColor.redColor()
    ]
    var gString = NSMutableAttributedString(string:"g", attributes:attrs)
    attributedString.appendAttributedString(gString)

    myBtn.titleLabel?.attributedText = attributedString;

그러나 여전히 결과는 없습니다. 또한 밑줄 속성에 액세스하는 방법을 알아야합니다. 텍스트, 크기 및 색상은 동일하게 유지됩니다.


감사합니다. 어떤 이유로 든 작동하지 않습니다. 밑줄 속성에 대해서도 알아야합니다.
moonvader

답변:


92

여기 있습니다. 방금 테스트했습니다. (적어도 xCode 7 베타에서 작동)

@IBOutlet weak var yourButton: UIButton!

var attrs = [
NSFontAttributeName : UIFont.systemFontOfSize(19.0),
NSForegroundColorAttributeName : UIColor.redColor(),
NSUnderlineStyleAttributeName : 1]

var attributedString = NSMutableAttributedString(string:"")

override func viewDidLoad() {
  super.viewDidLoad()

  let buttonTitleStr = NSMutableAttributedString(string:"My Button", attributes:attrs)
  attributedString.appendAttributedString(buttonTitleStr)
  yourButton.setAttributedTitle(attributedString, forState: .Normal)
}

108

스위프트 5 / Xcode 11

  @IBOutlet weak var myButton: UIButton!

  let yourAttributes: [NSAttributedString.Key: Any] = [
      .font: UIFont.systemFont(ofSize: 14),
      .foregroundColor: UIColor.blue,
      .underlineStyle: NSUnderlineStyle.single.rawValue]
         //.double.rawValue, .thick.rawValue

  override func viewDidLoad() {
     super.viewDidLoad()

     let attributeString = NSMutableAttributedString(string: "Your button text",
                                                     attributes: yourAttributes)
     myButton.setAttributedTitle(attributeString, for: .normal)
  }

스위프트 4 / Xcode 9

  @IBOutlet weak var myButton: UIButton!

  let yourAttributes : [NSAttributedStringKey: Any] = [
      NSAttributedStringKey.font : UIFont.systemFont(ofSize: 14),
      NSAttributedStringKey.foregroundColor : UIColor.blue,
      NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue]
         //.styleDouble.rawValue, .styleThick.rawValue, .styleNone.rawValue

  override func viewDidLoad() {
    super.viewDidLoad()

    let attributeString = NSMutableAttributedString(string: "Your button text",
                                                    attributes: yourAttributes)
    myButton.setAttributedTitle(attributeString, for: .normal)
  }

스위프트 3 / Xcode 8

  @IBOutlet weak var myButton: UIButton!

  let yourAttributes : [String: Any] = [
      NSFontAttributeName : UIFont.systemFont(ofSize: 14),
      NSForegroundColorAttributeName : UIColor.white,
      NSUnderlineStyleAttributeName : NSUnderlineStyle.styleSingle.rawValue] 
         //.styleDouble.rawValue, .styleThick.rawValue, .styleNone.rawValue

   override func viewDidLoad() {
      super.viewDidLoad()

      let attributeString = NSMutableAttributedString(string: "Your button text", 
                                                       attributes: yourAttributes)        
      myButton.setAttributedTitle(attributeString, for: .normal) 
    }

여기에 이미지 설명 입력


Swift 4에서이 오류가 발생했습니다. '[String : Any]'유형의 값을 예상 인수 유형 '[NSAttributedStringKey : Any]?'로 변환 할 수 없습니다.
Pavlos

설정 let마지막 줄에 2 일은 참고하시기 바랍니다 엑스 코드 9.1에서 충돌이 발생
잭 샤피로

이 경우 변경 불가능한 속성 문자열을 사용해야한다고 생각합니다. 예 : let attributeString = NSAttributedString (string : "Your button text", attributes : yourAttributes)
RunesReader

29

상속없이이 작업을 수행하는 방법을 찾고 있다면-

신속한 3/4/5

// in swift 4 - switch NSUnderlineStyleAttributeName with NSAttributedStringKey.underlineStyle

extension UIButton {
    func underline() {
        guard let text = self.titleLabel?.text else { return }
        let attributedString = NSMutableAttributedString(string: text)
        //NSAttributedStringKey.foregroundColor : UIColor.blue
        attributedString.addAttribute(NSAttributedString.Key.underlineColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count))
        attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count))
        attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: text.count))
        self.setAttributedTitle(attributedString, for: .normal)
    }
}



extension UILabel {
    func underline() {
        if let textString = self.text {
            let attributedString = NSMutableAttributedString(string: textString)
            attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: attributedString.length - 1))
            attributedText = attributedString
        }
    }
}

23

스토리 보드 : 스토리 보드의 텍스트에 밑줄을 긋고 싶은 경우.

  • 속성으로 단추 또는 레이블 제목을 선택하십시오.
  • 밑줄을 칠 텍스트 범위를 선택하십시오.
  • 마우스 오른쪽 버튼을 클릭하고 글꼴을 선택한 다음 밑줄을 선택합니다.

여기에 이미지 설명 입력


19

이전 답변 중 일부를 기반으로 앱에 쉽게 구현할 수있는 수업을 만들기로 결정했습니다.

스위프트 4

import UIKit

class UnderlineTextButton: UIButton {

override func setTitle(_ title: String?, for state: UIControlState) {
    super.setTitle(title, for: .normal)
    self.setAttributedTitle(self.attributedString(), for: .normal)
}

private func attributedString() -> NSAttributedString? {
    let attributes : [NSAttributedStringKey : Any] = [
        NSAttributedStringKey.font : UIFont.systemFont(ofSize: 19.0),
        NSAttributedStringKey.foregroundColor : UIColor.red,
        NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
    ]
    let attributedString = NSAttributedString(string: self.currentTitle!, attributes: attributes)
    return attributedString
  }
}

코드에서 나는 그런 식으로 부른다. button.setTitle(author, for: .normal)


15

코드를 게시 해 주셔서 감사합니다. 어트 리뷰 션 된 문자열을 만드는 방법을 아는 것이 분명하지 않았습니다.

이것은 작동합니다.

var attrs = [
    NSFontAttributeName : UIFont.systemFontOfSize(19.0),
    NSForegroundColorAttributeName : UIColor.redColor(),
    NSUnderlineStyleAttributeName : NSUnderlineStyle.StyleSingle.rawValue
]

Swift 4 버전 :

var attrs : [NSAttributedStringKey : Any] = [
    NSAttributedStringKey.font : UIFont.systemFont(ofSize: 19.0),
    NSAttributedStringKey.foregroundColor : UIColor.red,
    NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
]

내가 NSUnderlineStyleAttributeName를 추가 할 때 biuld을 중지 것 : NSUnderlineStyle.StyleSingle을
moonvader

죄송합니다. ObjC와 Swift 사이에 몇 가지 사항이 섞여 있습니다. 당신은 .rawValue 필요
Glorfindel

내가 왜 몰라하지만 버튼의 레이블은 변경되지 않는다
moonvader

@moonvader 버튼을 다룰 때 직접 액세스하여 레이블을 변경할 수 없습니다 titleLabel. 오히려, 당신은 사용해야합니다button.setAttributedTitle(attributedString, forState: .Normal)
나다니엘 Blumer

11

@ShlomoKoppel 대답Swift 4.2

extension UIButton {
    func underline() {
        guard let text = self.titleLabel?.text else { return }
        let attributedString = NSMutableAttributedString(string: text)
        //NSAttributedStringKey.foregroundColor : UIColor.blue
        attributedString.addAttribute(NSAttributedString.Key.underlineColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count))
        attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count))
        attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: text.count))
        self.setAttributedTitle(attributedString, for: .normal)
    }
}



extension UILabel {
    func underlineMyText() {
        if let textString = self.text {
            let attributedString = NSMutableAttributedString(string: textString)
            attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: attributedString.length - 1))
            attributedText = attributedString
        }
    }
}

6

다음은 스토리 보드에서 이루어집니다. (Xcode 9.1)

  1. 보기에서 Button 개체를 선택합니다.
  2. 글꼴 설정 열기

여기에 이미지 설명 입력

  1. 단일 밑줄 선택

여기에 이미지 설명 입력

  1. 텍스트를 입력하고 [Enter]를 누르십시오.

1
컴퓨터에 글꼴이 설치되어 있지 않으면이 옵션이 작동하지 않습니다. 프로젝트에 사용자 정의 글꼴을 추가했지만 로컬에 설치되지 않은 경우 글꼴이 사용 가능한 옵션에 표시되지 않습니다.
B-Rad

4

이것이 내 해결책입니다. 솔직히 말해서 아마도 이곳이 한 곳 이상 필요하니 확장을 만들어 보겠습니다. 이것은 신속한 5.0입니다 Cheers :)

extension UIButton {
    func underline() {
        guard let title = self.titleLabel else { return }
        guard let tittleText = title.text else { return }
        let attributedString = NSMutableAttributedString(string: (tittleText))
        attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: (tittleText.count)))
        self.setAttributedTitle(attributedString, for: .normal)
    }
}

이렇게 사용할 수 있습니다.

    override func viewDidLoad() {
     super.viewDidLoad()
     button.underline()
}

3
  • 스위프트 5.2.4
  • Xcode 11.5
let attributes: [NSAttributedString.Key : Any] = [
NSAttributedString.Key.underlineStyle: 1,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 13),
NSAttributedString.Key.foregroundColor: UIColor.systemGray3
]

let attributedString = NSMutableAttributedString(string: "Text here", attributes: attributes)
button.setAttributedTitle(NSAttributedString(attributedString: attributedString), for: .normal)

2

신속한 5

var attrs : [NSAttributedString.Key : Any] = [
    NSAttributedString.Key.font : UIFont.systemFont(ofSize: 19.0),
    NSAttributedString.Key.foregroundColor : UIColor.blue,
    NSAttributedString.Key.underlineStyle : NSUnderlineStyle.styleSingle.rawValue
]

2

버튼 제목에 대한 @ shlomo-koppel 답변의 수정 된 버전, 프로그래밍 방식으로 버튼 제목을 설정 / 변경하면 작동합니다 (제 경우에는 현지화를 사용했습니다).

extension UIButton {
    func underline() {
        guard let text = self.currentTitle else { return }
        let attributedString = NSMutableAttributedString(string: text)
        attributedString.addAttribute(NSAttributedString.Key.underlineColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count))
        attributedString.addAttribute(NSAttributedString.Key.foregroundColor, value: self.titleColor(for: .normal)!, range: NSRange(location: 0, length: text.count))
        attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: text.count))
        self.setAttributedTitle(attributedString, for: .normal)
    }
}

1

여기에 밑줄과 굵은 얼굴도 추가 할 수 있습니다. 신속한 클래스 파일에 확장자를 추가 할 수 있습니다.

다음은 확장명입니다 (Swift 4 업데이트 됨).

extension NSMutableAttributedString {
 @discardableResult func bold(_ text:String) -> NSMutableAttributedString {

      let attrs : [NSAttributedStringKey : Any] = [
        NSAttributedStringKey.font : UIFont(name: "Montserrat-Bold", size: 12)!,
        NSAttributedStringKey.foregroundColor : UIColor.white,
        NSAttributedStringKey.underlineStyle : NSUnderlineStyle.styleSingle.rawValue]
    let boldString = NSMutableAttributedString(string: text, attributes: attrs)
    self.append(boldString)
    return self
 }

 @discardableResult func normal(_ text:String)->NSMutableAttributedString {
      let attrs : [NSAttributedStringKey : Any] = [
        NSAttributedStringKey.font : UIFont(name: "Montserrat-Regular", size: 12)!,
        NSAttributedStringKey.foregroundColor : UIColor.white
    ]
    let normal =  NSAttributedString(string: text,  attributes:attrs)
    self.append(normal)
    return self
 }

}

다음과 같이 사용할 수 있습니다.

let FormattedText = NSMutableAttributedString()
      FormattedText
           .normal("By signing in, you agree with our ")
           .bold("Terms of Service")

yourLabel.attributedText = FormattedText

결과는 다음과 같이 표시됩니다. 여기에 이미지 설명 입력


0

최선의 접근 방식은 아닐 수 있지만 별도의 클래스와 함께 사용하고 one line 하고 텍스트를 얻기 위해 호출 .

내 수업은 다음과 같습니다.

import Foundation
import UIKit

enum AttributedTextsType {
    case underlined
    case bold
    case boldUnderlined
}

class AttributedTexts {
    private static func underlinedText(color: UIColor, size: CGFloat) -> [NSAttributedString.Key : Any] {
    let attrs = [
        NSAttributedString.Key.font : UIFont.systemFont(ofSize: size),
        NSAttributedString.Key.foregroundColor : color,
        NSAttributedString.Key.underlineStyle : 1] as [NSAttributedString.Key : Any]
    return attrs
    }

    private static func getAttibute(type: AttributedTextsType, color: UIColor, size: CGFloat) -> [NSAttributedString.Key : Any] {
        var attributes: [NSAttributedString.Key : Any]!
        switch type {
        case .underlined:
            attributes = AttributedTexts.underlinedText(color: color, size: size)
            break
        case .bold:
            attributes = AttributedTexts.underlinedText(color: color, size: size)
            break
        case .boldUnderlined:
            attributes = AttributedTexts.underlinedText(color: color, size: size)
            break
        }
        return attributes
    }

    static func set(string: String, color: UIColor, type: AttributedTextsType, size: CGFloat = 19.0) -> NSMutableAttributedString {
        let attributes = getAttibute(type: type, color: color, size: size)
        let attributedString = NSMutableAttributedString(string:"")
        let buttonTitleStr = NSMutableAttributedString(string: string, attributes: attributes)
        attributedString.append(buttonTitleStr)
        return attributedString
    }
}

용법 let attributedString = AttributedTexts.set(string: "Skip", color: .white, type: .underlined, size: 19.0)

친애하는

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.