Как подчеркнуть UILabel
в Swift? Я искал Objective-C, но не смог заставить их работать в Swift.
ios
swift
overriding
uilabel
nsattributedstring
Esqarrouth
источник
источник
NSAttributedString
?Ответы:
Вы можете сделать это с помощью NSAttributedString
Пример:
let underlineAttribute = [NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue] let underlineAttributedString = NSAttributedString(string: "StringWithUnderLine", attributes: underlineAttribute) myLabel.attributedText = underlineAttributedString
РЕДАКТИРОВАТЬ
Чтобы иметь одинаковые атрибуты для всех текстов одного UILabel, я предлагаю вам создать подкласс UILabel и переопределить текст, например:
Swift 4.2
class UnderlinedLabel: UILabel { override var text: String? { didSet { guard let text = text else { return } let textRange = NSMakeRange(0, text.count) let attributedText = NSMutableAttributedString(string: text) attributedText.addAttribute(NSAttributedString.Key.underlineStyle , value: NSUnderlineStyle.single.rawValue, range: textRange) // Add other attributes if needed self.attributedText = attributedText } } }
Swift 3.0
class UnderlinedLabel: UILabel { override var text: String? { didSet { guard let text = text else { return } let textRange = NSMakeRange(0, text.characters.count) let attributedText = NSMutableAttributedString(string: text) attributedText.addAttribute(NSUnderlineStyleAttributeName , value: NSUnderlineStyle.styleSingle.rawValue, range: textRange) // Add other attributes if needed self.attributedText = attributedText } } }
И вы помещаете свой текст так:
@IBOutlet weak var label: UnderlinedLabel! override func viewDidLoad() { super.viewDidLoad() label.text = "StringWithUnderLine" }
СТАРЫЙ:
Swift (от 2,0 до 2,3):
class UnderlinedLabel: UILabel { override var text: String? { didSet { guard let text = text else { return } let textRange = NSMakeRange(0, text.characters.count) let attributedText = NSMutableAttributedString(string: text) attributedText.addAttribute(NSUnderlineStyleAttributeName, value:NSUnderlineStyle.StyleSingle.rawValue, range: textRange) // Add other attributes if needed self.attributedText = attributedText } } }
Swift 1.2:
class UnderlinedLabel: UILabel { override var text: String! { didSet { let textRange = NSMakeRange(0, count(text)) let attributedText = NSMutableAttributedString(string: text) attributedText.addAttribute(NSUnderlineStyleAttributeName, value:NSUnderlineStyle.StyleSingle.rawValue, range: textRange) // Add other attributes if needed self.attributedText = attributedText } } }
источник
UTF16
При создании textRange вы должны передавать count вместо количества символовNSRange
required init?(coder: NSCoder) { super.init(coder: coder) self.addUnderline() // your code }
Swift 5 и 4.2 один лайнер:
label.attributedText = NSAttributedString(string: "Text", attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue])
Swift 4 однострочник:
label.attributedText = NSAttributedString(string: "Text", attributes: [.underlineStyle: NSUnderlineStyle.styleSingle.rawValue])
Swift 3 один лайнер:
label.attributedText = NSAttributedString(string: "Text", attributes: [NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue])
источник
Если вы ищете способ сделать это без наследования:
Swift 5
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)) attributedText = attributedString } } }
Swift 3/4
// in swift 4 - switch NSUnderlineStyleAttributeName with NSAttributedStringKey.underlineStyle extension UILabel { func underline() { if let textString = self.text { let attributedString = NSMutableAttributedString(string: textString) attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0, length: attributedString.length)) attributedText = attributedString } } } extension UIButton { func underline() { let attributedString = NSMutableAttributedString(string: (self.titleLabel?.text!)!) attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0, length: (self.titleLabel?.text!.characters.count)!)) self.setAttributedTitle(attributedString, for: .normal) } }
источник
UTF16
счетчик вместо счетчика символов при создании своегоNSRange
Swift 5:
1- Создайте расширение String для получения attributedText
extension String { var underLined: NSAttributedString { NSMutableAttributedString(string: self, attributes: [.underlineStyle: NSUnderlineStyle.single.rawValue]) } }
2- Используйте это
На кнопках:
button.setAttributedTitle(yourButtonTitle.underLined, for: .normal)
На этикетках:
Или версия Stoyboard
источник
Небольшое исправление для ответа Shlome в Swift 4 и Xcode 9 .
extension UILabel { func underline() { if let textString = self.text { let attributedString = NSMutableAttributedString(string: textString) attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0, length: attributedString.length - 1)) attributedText = attributedString } } } extension UIButton { func underline() { let attributedString = NSMutableAttributedString(string: (self.titleLabel?.text!)!) attributedString.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: NSRange(location: 0, length: (self.titleLabel?.text!.count)!)) self.setAttributedTitle(attributedString, for: .normal) } }
источник
UTF16
счетчик вместо счетчика символов при создании своегоNSRange
Вы можете подчеркнуть
UILabel
текст, используя Интерфейсный Разработчик.Вот ссылка на мой ответ: Добавление атрибута подчеркивания к частичному тексту UILabel в раскадровке
источник
Тот же ответ в Swift 4.2
Для UILable
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: textString.count)) self.attributedText = attributedString } } }
Позвоните в UILabel, как показано ниже
Для UIButton
extension UIButton { func underline() { if let textString = self.titleLabel?.text { let attributedString = NSMutableAttributedString(string: textString) attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: textString.count)) self.setAttributedTitle(attributedString, for: .normal) } } }
Позвоните для UIButton, как показано ниже
Я просмотрел ответы выше, и некоторые из них - это принудительное развертывание текстового значения. Я предлагаю получить ценность, безопасно развернув. Это позволит избежать сбоя в случае нулевого значения. Надеюсь это поможет :)
источник
UTF16
счетчик вместо счетчика символов при создании своегоNSRange
Swift 4, 4.2 и 5.
@IBOutlet weak var lblUnderLine: UILabel!
Мне нужно подчеркнуть определенный текст в UILabel. Итак, найдите диапазон и установите атрибуты.
let strSignup = "Don't have account? SIGNUP NOW." let rangeSignUp = NSString(string: strSignup).range(of: "SIGNUP NOW.", options: String.CompareOptions.caseInsensitive) let rangeFull = NSString(string: strSignup).range(of: strSignup, options: String.CompareOptions.caseInsensitive) let attrStr = NSMutableAttributedString.init(string:strSignup) attrStr.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.white, NSAttributedString.Key.font : UIFont.init(name: "Helvetica", size: 17)! as Any],range: rangeFull) attrStr.addAttributes([NSAttributedString.Key.foregroundColor : UIColor.white, NSAttributedString.Key.font : UIFont.init(name: "Helvetica", size: 20)!, NSAttributedString.Key.underlineStyle: NSUnderlineStyle.thick.rawValue as Any],range: rangeSignUp) // for swift 4 -> Change thick to styleThick lblUnderLine.attributedText = attrStr
Выход
источник
Подчеркните несколько строк в предложении.
extension UILabel { func underlineMyText(range1:String, range2:String) { if let textString = self.text { let str = NSString(string: textString) let firstRange = str.range(of: range1) let secRange = str.range(of: range2) let attributedString = NSMutableAttributedString(string: textString) attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: firstRange) attributedString.addAttribute(NSAttributedString.Key.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: secRange) attributedText = attributedString } } }
Используйте таким образом.
lbl.text = "By continuing you agree to our Terms of Service and Privacy Policy." lbl.underlineMyText(range1: "Terms of Service", range2: "Privacy Policy.")
источник
Swift 4 изменения. Не забудьте использовать NSUnderlineStyle.styleSingle.rawValue вместо NSUnderlineStyle.styleSingle .
'let attributedString = NSAttributedString(string: "Testing") let textRange = NSMakeRange(0, attributedString.length) let underlinedMessage = NSMutableAttributedString(attributedString: attributedString) underlinedMessage.addAttribute(NSAttributedStringKey.underlineStyle, value:NSUnderlineStyle.styleSingle.rawValue, range: textRange) label.attributedText = underlinedMessage
`
источник
Вы также можете использовать это, если хотите получить только половину метки, как подчеркивание: - // Для Swift 4.0+
let attributesForUnderLine: [NSAttributedString.Key: Any] = [ .font: UIFont(name: AppFont.sourceSansPro_Regular, size: 12) ?? UIFont.systemFont(ofSize: 11), .foregroundColor: UIColor.blue, .underlineStyle: NSUnderlineStyle.single.rawValue] let attributesForNormalText: [NSAttributedString.Key: Any] = [ .font: UIFont(name: AppFont.sourceSansPro_Regular, size: 12) ?? UIFont.systemFont(ofSize: 11), .foregroundColor: AppColors.ColorText_787878] let textToSet = "Want to change your preferences? Edit Now" let rangeOfUnderLine = (textToSet as NSString).range(of: "Edit Now") let rangeOfNormalText = (textToSet as NSString).range(of: "Want to change your preferences?") let attributedText = NSMutableAttributedString(string: textToSet) attributedText.addAttributes(attributesForUnderLine, range: rangeOfUnderLine) attributedText.addAttributes(attributesForNormalText, range: rangeOfNormalText) yourLabel.attributedText = attributedText
источник
Ответ выше вызывает ошибку в моей среде сборки.
Это не работает в Swift 4.0:
attributedText.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: textRange)
Попробуйте вместо этого:
attributedText.addAttribute(NSAttributedStringKey.underlineStyle, value: NSUnderlineStyle.styleSingle.rawValue, range: textRange)
надеюсь, это кому-то поможет.
источник
// Версия Swift 4
let attributedString = NSMutableAttributedString(string: "Your Text Here", attributes: [NSAttributedStringKey.underlineStyle : true]) self.yourlabel.attributedText = attributedString
источник
Для Swift 2.3
extension UIButton { func underline() { let attributedString = NSMutableAttributedString(string: (self.titleLabel?.text!)!) attributedString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: NSRange(location: 0, length: (self.titleLabel?.text!.characters.count)!)) self.setAttributedTitle(attributedString, forState: .Normal) } }
и в ViewController
@IBOutlet var yourButton: UIButton!
в
ViewDidLoad
методе или в своей функции просто напишитеон подчеркнет заголовок вашей кнопки
источник
Класс для установки и удаления подчеркивания для кнопок UI для Swift 5. Надеюсь, это поможет
import Foundation import UIKit class UiUtil { static let underlineThickness = 2 class func removeUnderlineFromButton( _ button:UIButton ) { if let str = button.titleLabel?.attributedText { let attributedString = NSMutableAttributedString( attributedString: str ) attributedString.removeAttribute(.underlineStyle, range: NSRange.init(location: 0, length: attributedString.length)) button.setAttributedTitle(attributedString, for: .normal) } } class func setUnderlineFromButton( _ button:UIButton ) { if let str = button.titleLabel?.attributedText { let attributedStringUnderline = NSMutableAttributedString( attributedString: str ) attributedStringUnderline.addAttribute( NSAttributedString.Key.underlineStyle, value: underlineThickness, range: NSRange.init(location: 0, length: attributedStringUnderline.length) ) button.setAttributedTitle(attributedStringUnderline, for: .normal) } } }
источник