Создавать прозрачность между линиями UILabel со Свифтом

Имея label нескольких линий и в фон изображение. Как делать для того, чтобы видели?

introducir la descripción de la imagen aquí

https://stackoverflow.com / в / 3908991/3957845

В этом вопросе они ссылаются в drawTextInRect но также я не нахожу специфический способ, как использования этого.

2
задан 23.05.2017, 15:39
0 ответов

Это тема, сложная но не невозможная достичь для того, чтобы его и требует достаточно кода.

Идея - что для того, чтобы NSMutableString обнаружьте параграфы текст должен содержать разрывы линии \n. Логически, поскольку у каждого устройства есть отличный размер и текст не приспосабливается равно в каждом размере экрана, мы нуждаемся в том, чтобы узнать все линии он имеет UILabel и ранги каждой линии.

Для этого ты будешь нуждаться в этом расширении, которое я создал для этого:

// MARK: - UILabel extension para encontrar cada línea
import CoreText

extension UILabel {

    func everyLineRange(skipN: Bool = false) -> [NSRange]? {

        self.layoutIfNeeded()

        let font: CTFont = CTFontCreateWithName((self.text ?? "") as CFString, self.font.pointSize, nil)

        let mutableString = NSMutableAttributedString(string: self.text ?? "", attributes: [kCTFontAttributeName as String: font])
        let frameSetter: CTFramesetter = CTFramesetterCreateWithAttributedString(mutableString)

        let path = CGMutablePath()
        path.addRect(CGRect(x: 0.0, y: 0.0, width: self.bounds.size.width, height: CGFloat.greatestFiniteMagnitude))

        let frame = CTFramesetterCreateFrame(frameSetter, CFRangeMake(0, 0), path, nil)
        guard let lines: [CTLine] = CTFrameGetLines(frame) as? [CTLine] else {
            return nil
        }

        var ranges = [NSRange]()
        for l in lines {
            let r = CTLineGetStringRange(l)
            ranges.append(NSMakeRange(r.location, skipN ? r.length - 1 : r.length))
        }

        return ranges

    }

}

Однажды у тебя есть ранги каждой линии, ты должен делать что-то таким, который я схватил:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var textLabel: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        // 1. El texto
        textLabel.text = "LOREM IPSUM DOLOR SIT, CONSECTETUR\nADIPISCING ELIT. FUSCE VITAE EFFICITUR\nLIGULA. LIGULA, PUR"

        // 2. Ahora necesitamos saber el rango de cada línea teniendo en cuenta los saltos de línea (ver extension UILabel)
        guard let initialRanges = textLabel.everyLineRange() else { return }

        // 3. Para poder realizar el efecto, debemos añadir un salto de línea al texto en función de cada rango (cada línea)
        var stringN = ""
        for r in initialRanges {
            let text = (textLabel.text! as NSString).substring(with: r).trimmingCharacters(in: .whitespacesAndNewlines)
            stringN += text + "\n"
        }

        // 4. Asignamos el texto de nuevo
        textLabel.text = stringN

        // 5. Volvemos a sacar los rangos omitiendo los \n (ver extension UILabel)
        guard let ranges = textLabel.everyLineRange(skipN: true) else { return }

        // 6. Añadimos separación a lo parágrafos y el fondo blanco
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.paragraphSpacing = 5.0

        let attributedText = NSMutableAttributedString(string: textLabel.text ?? "", attributes: [NSParagraphStyleAttributeName: paragraphStyle])
        for r in ranges {
            attributedText.addAttributes([NSBackgroundColorAttributeName: UIColor.white], range: r)
        }

        // 7. Asignamos el texto final
        textLabel.attributedText = attributedText

    }

}

И ты достигнешь следующего эффекта:

introducir la descripción de la imagen aquí

1
ответ дан 03.12.2019, 17:31
  • 1
    Большое спасибо @mhergon - такой который эффект, который он хотел. Я новый в Свифте 3, я хотел бы узнать, если podrí чтобы вступать в контакт с тобой, чтобы осветлять этот тип немного сложных сомнений для меня и каких-то советов от хорошей практики? Моя почта chergueta@3dlinkweb.com. Привет –  25.01.2017, 18:48
  • 2
    Каждое что-нибудь в этом роде programació n ты можешь спрашивать это из-за aquí. Estaré в так помогать для тебе. Привет –  25.01.2017, 19:56

Основанный на информации, которую ты предоставляешь нам, я думаю, что это это, что ты ищешь.

Программным способом, в функции viewDidLoad () (Которая начинается программой / приложением), мы распределяем динамическим способом текст и раздвинутого между линиями (5 для примера).

Я надеюсь, что он помогает тебе.

import UIKit

class ViewController: UIViewController {

    @IBOutlet var label: UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        let texto = "LOREM IPSUM DOLOR SIT, CONSECTETUR ADIPISCING ELIT. FUSCE VITAE EFFICITUR LIGULA. LIGULA, PUR"

        let atributo = NSMutableAttributedString(string: texto)
        let parrafo = NSMutableParagraphStyle()

        parrafo.lineSpacing = 5 /* Este es el espacio entre lineas */
        atributo.addAttribute(NSParagraphStyleAttributeName, value: parrafo, range: NSMakeRange(0, atributo.length))

        label.attributedText = atributo

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

}
0
ответ дан 03.12.2019, 17:31
  • 1
    Спасибо за ответ Иван, действительно с этим có я говорю, что я верю в место между линиями, но это место не является прозрачным, которым виден ни один блок ни одного цвета. –  24.01.2017, 19:27