48 votes

iOS 10.3: NSStrikethroughStyleAttributeName n'est pas rendu s'il est appliqué à une sous-plage de NSMutableAttributedString

Un barré (simple, double, ...) ajouté en tant qu'attribut à une instance de NSMutableAttributedString n'est pas rendu si la plage d'application n'est pas la plage entière de chaînes.

Cela se produit avec addAttribute(_ name: String, value: Any, range: NSRange) , insert(_ attrString: NSAttributedString, at loc: Int) , append(_ attrString: NSAttributedString) , ...

Cassé par Apple dans les premières versions iOS 10.3, et non corrigé dans la version 10.3 finale.

Crédit: https://openradar.appspot.com/31034683

93voto

snowman4415 Points 415

Définir le décalage de la ligne de base semble résoudre le problème:

 [attributedStr addAttribute:NSBaselineOffsetAttributeName value:@0 range:NSMakeRange(0, 10)];
[attributedStr addAttribute:NSStrikethroughStyleAttributeName value:@2 range:NSMakeRange(0, 10)];
 

C'est un bug connu sous iOS 10.3

26voto

Mugunth Points 8671

Ajouter un NSBaselineOffsetAttributeName , comme expliqué ici , à la chaîne attribuée ramène la ligne barrée. Remplacer drawText:in: peut être lent, en particulier sur les cellules Vue de collection ou Vue de tableau.

14voto

rshev Points 2988

Nous avons trouvé une solution de contournement pour notre scénario spécifique (nous ne spécifions aucun style avec les propriétés d'UILabel, mais avec des attributs NSAttributedString ):

 /// This UILabel subclass accomodates conditional fix for NSAttributedString rendering broken by Apple in iOS 10.3
final class PriceLabel: UILabel {

    override func drawText(in rect: CGRect) {
        guard let attributedText = attributedText else {
            super.drawText(in: rect)
            return
        }

        if #available(iOS 10.3, *) {
            attributedText.draw(in: rect)
        } else {
            super.drawText(in: rect)
        }
    }
}
 

REMARQUE: si vous mélangez les propriétés de style d'UILabel avec les attributs NSAttributedString , pensez à créer une nouvelle chaîne attribuée avant le rendu, appliquez le style de UILabel dessus, puis réappliquez tous les attributedText attributs sur elle.

10voto

Velu Loganathan Points 166

swift 3 code de travail testé avec 10.3

 let attributeString: NSMutableAttributedString = NSMutableAttributedString(string: "₹3500")
attributeString.addAttribute(NSBaselineOffsetAttributeName, value: 0, range: NSMakeRange(0, attributeString.length))
attributeString.addAttribute(NSStrikethroughStyleAttributeName, value: 1, range: NSMakeRange(0, attributeString.length))
productPriceLabel.attributedText = attributeString
 

10voto

Yuchen Zhong Points 2600

Swift 4

 let text = "Hello World"
let textRange = NSMakeRange(0, text.count)
let attributedText = NSMutableAttributedString(string: text)
attributedText.addAttribute(NSAttributedStringKey.strikethroughStyle,
                            value: NSUnderlineStyle.styleSingle.rawValue,
                            range: textRange)
myLabel.attributedText = attributedText
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X