swift 下划线覆盖NSAttributedString中的文本

amrnrhlw  于 2023-08-02  发布在  Swift
关注(0)|答案(5)|浏览(163)

我试图创建一个属性字符串,但下划线覆盖了我的文本,而不是出现在它后面:
x1c 0d1x的数据
有办法解决吗?我使用以下代码:

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 10.0

let attributes = [NSForegroundColorAttributeName: UIColor.white,
                  NSUnderlineStyleAttributeName: NSUnderlineStyle.styleThick.rawValue,
                  NSUnderlineColorAttributeName: UIColor.red,
                  NSParagraphStyleAttributeName: paragraphStyle]

let attributedString = NSAttributedString(string: "Story", attributes: attributes)

字符串
谢谢你,谢谢
编辑:
要给予更多上下文:
我在放置在.xib文件中的UILabel上显示属性字符串:

view.textLabel.attributedText = attributedString


标签的字体如下:系统粗体32.0
我在iPhone 6 - iOS 10.3模拟器上运行代码。
编辑2:
我应该提到,在某些时候,标签可能包含多行文本。这就是numberOfLines设置为0的原因。
编辑3:如果有人遇到这个问题-似乎在iOS 9与10以及UILabel与UITextView上绘制下划线的方式有很大差异。我最终不得不通过子类化NSLayoutManager来自己画下划线。

pdsfdshx

pdsfdshx1#

是的,确实有你所描述的问题。当您使用多行UILabel时,它会显示出来,因此不仅要将numberOfLines设置为0,还要在其中键入多行。

示例

let selectedStringAttributes: [String: Any]
    = [NSFontAttributeName: UIFont.boldSystemFont(ofSize: 28),
       NSForegroundColorAttributeName: UIColor.green,
       NSUnderlineStyleAttributeName: NSUnderlineStyle.styleSingle.rawValue,
       NSUnderlineColorAttributeName: UIColor.green]

let label = UILabel(frame: CGRect(x: 100, y: 100, width: 500, height: 100))
label.numberOfLines = 0

label.attributedText = NSAttributedString(string: "String to test underline", attributes: selectedStringAttributes)

字符串
一切看起来都很好。
但是如果你想使用这样的文本:

label.attributedText = NSAttributedString(string: "String to\ntest underline", attributes: selectedStringAttributes)


或标签的宽度过短,则:


的数据
所以这种行为的原因当然是NSAttributedString中的bug。正如雷达中提到的,有一个解决方案
您应该将此属性添加到NSAttributedString

NSBaselineOffsetAttributeName: 0


奇迹就会发生。

ct2axkht

ct2axkht2#

在我的机器上,在黑色背景的UILabel中显示属性字符串,它的显示效果非常好:
x1c 0d1x的数据
红色粗下划线与文本很好地分开,并被中断以允许“y”的下降部分通过它。

注意不能将UILabel的font(在Interface Builder中设置)与其attributedText合并。您必须在attributedText中设置 entire 标签的文本格式。所以,我的代码看起来像这样:

let attributes : [String:Any] = [NSForegroundColorAttributeName: UIColor.white,
                      NSUnderlineStyleAttributeName: NSUnderlineStyle.styleThick.rawValue,
                      NSUnderlineColorAttributeName: UIColor.red,
                      NSFontAttributeName: UIFont.boldSystemFont(ofSize: 32)]
    let attributedString = NSAttributedString(string: "Story", attributes: attributes)
    lab.backgroundColor = .black
    lab.attributedText = attributedString

字符串
(You会注意到我删除了你对段落行距的规定;只有一行,所以这个规定没有增加什么。但是,即使我恢复它,也会得到相同的结果。)

z4bn682m

z4bn682m3#

不使用NSAttributedString,你可以使用这个在标签下面用x空格画边框。

let space:CGFloat = 10

let border = CALayer()
border.backgroundColor = UIColor.red.cgColor
border.frame = CGRect(x: 0, y: (label?.frame.size.height)! + space, width: (label?.frame.size.width)!, height: 1)
label?.layer.addSublayer(border)

字符串

4dbbbstv

4dbbbstv4#

这就是我对这个问题的解决方案。我认为这是“更干净”和更容易。如果你不明白,就发邮件给我:)

class BottomLineTextField: UITextField {

    var bottomBorder = UIView()

    override func awakeFromNib() {
        super.awakeFromNib()
        setBottomBorder()
    }

    func setBottomBorder() {            
        self.translatesAutoresizingMaskIntoConstraints = false

        bottomBorder = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
        hasError = false
        bottomBorder.translatesAutoresizingMaskIntoConstraints = false

        addSubview(bottomBorder)

        bottomBorder.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
        bottomBorder.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
        bottomBorder.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
        bottomBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true // Set underline height
    }
}

字符串

tnkciper

tnkciper5#

我知道它的迟来的答复,但经过几个小时的搜索,找到了如下修复

extension NSAttributedString {
    func withUnderlineSpacing(spacing: CGFloat) -> NSAttributedString {
        let attributedString = NSMutableAttributedString(attributedString: self)
        attributedString.addAttribute(.underlineStyle, value: NSUnderlineStyle.single.rawValue, range: NSRange(location: 0, length: self.length))
        attributedString.addAttribute(.baselineOffset, value: spacing, range: NSRange(location: 0, length: self.length))
        return attributedString
    }
}

字符串

相关问题