2017-05-04 4 views
-1

Ich versuche, eine Zeichenfolge zugeschrieben, aber die unterstrichenen deckt meinen Text statt erscheinen dahinter zu erstellen:Unterstrichen deckt Text in NSAttributedString

enter image description here

Gibt es eine Möglichkeit, dies zu beheben? Ich benutze den folgenden Code:

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) 

Vielen Dank!

EDIT:

Um mehr Kontext zu geben:

ich die zugeschrieben Zeichenfolge auf einem UILabel in einer .xib Datei platziert Anzeigen:

view.textLabel.attributedText = attributedString 

Das Label hat die folgende Schrift: System Bold 32.0

Ich führe den Code auf iPhone 6 - iOS 10.3 Simulator.

EDIT 2:

Ich soll erwähnt, dass das Etikett an einem gewissen Punkt, mehr als eine Textzeile enthalten. Aus diesem Grund ist die NummerOfLines auf 0 gesetzt.

EDIT 3: Wenn jemand dieses Problem auftritt - es scheint, dass es große Unterschiede in der Unterstreichung auf iOS 9 vs 10 sowie UILabel vs UITextView gibt. Ich musste die Unterstreichung selbst zeichnen, indem ich NSLayoutManager abtrennte.

+1

Kann das Problem nicht reproduzieren. Auf meiner Maschine ist die Unterstreichung schön vom Text getrennt und schneidet nicht die Unterlänge des "y". https://i.stack.imgur.com/uXs4R.png Bitte zeigen Sie mehr von Ihrem Code, um dies reproduzierbar zu machen. Wie wird diese attributierte Zeichenfolge angezeigt? Welche Schriftart verwendest du? Und so weiter. – matt

+0

Auch hier kann ich Ihr Problem nicht in meinem Computer replizieren. Es wird schön getrennt vom Text angezeigt. @Grzegorz Aperliński – iPeter

+0

(Ich kann auch erwähnen, dass Ihr Code nicht auf meinem Rechner kompiliert wurde. Es ist notwendig, 'Attribute' explizit als vom Typ' [String: Any] 'zu deklarieren.) – matt

Antwort

2

Ja, es gibt ein Problem, das Sie beschrieben haben. Es wird angezeigt, wenn Sie multiline UILabel verwenden, also nicht nur numberOfLines auf 0 setzen, sondern mehr als 1 Zeile eingeben.

Beispiel

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) 

Und alles wird ziemlich gut aussehen.

Aber wenn Sie solchen Text verwenden mögen:

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

oder Etikettenbreite zu kurz ist, als:

Not so good

So ist der Grund für dieses Verhalten ist natürlich bug in NSAttributedString . Wie es in der Radar erwähnt gibt es eine Abhilfe

Sie dieses Attribut wird

Und Magie Ihres NSAttributedString

passieren sollte hinzufügen.

+0

Danke dafür! Ich habe tatsächlich benutzerdefinierte Zeichnung mit einer Unterklasse von NSLayoutManager implementiert. Hoffentlich wird dieses Problem in Zukunft gelöst werden. –

2

Auf meinem Rechner Ihre zugeschrieben Zeichenfolge in einem Schwarz backgrounded UILabel zeigt, macht es eine ziemlich gut aussehende Anzeige:

enter image description here

Die rote dick unterstrichen schön aus dem Text getrennt ist, und ist unterbrochen, damit der Absender des "y" hindurchgehen kann.

HINWEIS Sie nicht die font der UILabel (Set im Interface Builder) mit seinem attributedText kombinieren. Sie müssen die gesamte Beschriftung der Textformatierung in attributedText festlegen. So sieht mein Code wie folgt aus:

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 

(Sie werden feststellen, dass ich Ihre Bestimmung des Absatzes Zeilenabstand entfernt, es gibt nur eine Linie, so dass diese Bestimmung nichts hinzufügt Allerdings bekomme ich das gleiche Ergebnis auch. Wenn ich es wiederherstelle.)

+0

Danke! Tatsächlich habe ich, zumindest beim Rendern, einen kleinen Unterschied zwischen dem im Code und in IB eingestellten Schriftgewicht festgestellt. Ich habe endlich die Ursache des Problems entdeckt (und den ursprünglichen Eintrag bearbeitet) - das Problem tritt auf, wenn Sie die Anzahl der Zeilen auf 0 setzen. Entschuldigung, ich hätte erwähnen sollen, dass ich das geändert habe, aber nicht für relevant hielt ... –

2

Anstatt NSAttributedString zu verwenden, können Sie mit dieser Option Rahmen unter dem Label mit x-Leerzeichen zeichnen.

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) 
+2

Danke! Ich habe darüber nachgedacht, dies zu tun, aber es kann mehr als eine Zeile Text geben, so dass dies für mich nicht schneidet. –

2

Das ist also meine Lösung für dieses Problem. Ich denke, es ist "sauberer" und einfacher. Post mich, wenn Sie nicht verstehen :)

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 
    } 
} 
+1

Diese Lösung ist in Ordnung, solange nur eine Textzeile vorhanden ist. –

+1

Hallo @ GrzegorzAperliński, hast du recht. Ich habe das nur für eine Zeile gemacht – ironRoei

Verwandte Themen