texto que pasos parrafos para líneas llama lineas espacio entre doble distancia deja como aumentar ios nsattributedstring underline

ios - que - espacio entre parrafos word 2010



NSUnderlineStyleAttributeName Espacio entre líneas (3)

Agregué una línea (UIView) con altura 1 y ancho como una etiqueta, alineada con la parte inferior de la UILabel.

let label = UILabel() label.text = "underlined text" let spacing = 2 // will be added as negative bottom margin for more spacing between label and line let line = UIView() line.translatesAutoresizingMaskIntoConstraints = false line.backgroundColor = label.textColor label.addSubview(line) label.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|[line]|", metrics: nil, views: ["line":line])) label.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[line(1)]-(/(-spacing))-|", metrics: nil, views: ["line":line]))

Quiero que el subrayado esté debajo del texto como cualquier otro mecanismo de subrayado normal. Sin embargo, con la cadena NSAttributed deja agujeros con "g''s" e "y''s"

ejemplo:

Como debe verse:

¿Cómo puedo aumentar el espacio entre el subrayado y la etiqueta?


Podría usar UITextView. Agregué NSAttributedStringKey personalizado "customUnderline" y el método swizzling drawUnderline en NSLayoutManager.

import Foundation import SwiftyAttributes import UIKit private let swizzling: (AnyClass, Selector, Selector) -> Void = { forClass, originalSelector, swizzledSelector in guard let originalMethod = class_getInstanceMethod(forClass, originalSelector), let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector) else { return } method_exchangeImplementations(originalMethod, swizzledMethod) } extension NSAttributedStringKey { static var customUnderline: NSAttributedStringKey = NSAttributedStringKey("customUnderline") } extension Attribute { static var customUnderline: Attribute = Attribute.custom(NSAttributedStringKey.customUnderline.rawValue, true) } extension NSLayoutManager { // MARK: - Properties static let initSwizzling: Void = { let originalSelector = #selector(drawUnderline(forGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:)) let swizzledSelector = #selector(swizzled_drawUnderline(forGlyphRange:underlineType:baselineOffset:lineFragmentRect:lineFragmentGlyphRange:containerOrigin:)) swizzling(NSLayoutManager.self, originalSelector, swizzledSelector) }() // MARK: - Functions @objc func swizzled_drawUnderline(forGlyphRange glyphRange: NSRange, underlineType underlineVal: NSUnderlineStyle, baselineOffset: CGFloat, lineFragmentRect lineRect: CGRect, lineFragmentGlyphRange lineGlyphRange: NSRange, containerOrigin: CGPoint) { guard needCustomizeUnderline(underlineType: underlineVal) else { swizzled_drawUnderline(forGlyphRange: glyphRange, underlineType: underlineVal, baselineOffset: baselineOffset, lineFragmentRect: lineRect, lineFragmentGlyphRange: lineGlyphRange, containerOrigin: containerOrigin) return } let heightOffset = containerOrigin.y - 1 + (getFontHeight(in: glyphRange) ?? (lineRect.height / 2)) drawStrikethrough(forGlyphRange: glyphRange, strikethroughType: underlineVal, baselineOffset: baselineOffset, lineFragmentRect: lineRect, lineFragmentGlyphRange: lineGlyphRange, containerOrigin: CGPoint(x: containerOrigin.x, y: heightOffset)) } // MARK: - Private functions private func needCustomizeUnderline(underlineType underlineVal: NSUnderlineStyle) -> Bool { guard underlineVal == NSUnderlineStyle.styleSingle else { return false } let attributes = textStorage?.attributes(at: 0, effectiveRange: nil) guard let isCustomUnderline = attributes?.keys.contains(.customUnderline), isCustomUnderline else { return false } return true } private func getFontHeight(in glyphRange: NSRange) -> CGFloat? { let location = characterRange(forGlyphRange: glyphRange, actualGlyphRange: nil).location guard let font = textStorage?.attribute(.font, at: location, effectiveRange: nil) as? UIFont else { return nil } return font.capHeight } }

como eso


No hay forma de controlar ese comportamiento con NSAttributedString o CoreText (aparte de dibujar el subrayado). NSAttributedString no tiene opción para eso (y CoreText tampoco tiene una ).

En los sistemas Apple, la primera versión (con la brecha) es el comportamiento "esperado", ya que es el que Apple proporciona y se usa en todo el sistema (y aplicaciones como Safari, TextEdit, etc.).

Si realmente desea tener subrayados sin un espacio, debe dibujar la cadena sin subrayar y dibujar la línea usted mismo (lo que necesitaba hacer en uno de mis proyectos y puedo decirle que es difícil ; vea este archivo , búsqueda de "subrayado").