¿Cómo usar un NSAttributedString con un ScrollView en SwiftUI?

4
sbdchd 2020-01-24 14:43.

He podido renderizar NSAttributedStrings vía, UIViewRepresentableque funciona muy bien hasta que envuelvo la vista en un ScrollView.

Cuando se coloca dentro de ScrollView, la NSAttributedStringvista deja de renderizarse.

Probé algunos otros métodos que reemplazan un NSAttributedStringcon la adición de varias Text()vistas para obtener un formato que funciona dentro de ScrollViewy admite cursiva y monospace font. Desafortunadamente, esto no funciona para enlaces dentro de bloques de texto, lo que significa que todavía necesito un archivo NSAttributedString.

import SwiftUI

struct TextWithAttributedString: UIViewRepresentable {

    var attributedString: NSAttributedString

    init(_ attributedString: NSAttributedString) {
        self.attributedString = attributedString
    }

    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView(frame: .zero)
        textView.attributedText = self.attributedString
        textView.isEditable = false
        return textView
    }

    func updateUIView(_ textView: UITextView, context: Context) {
        textView.attributedText = self.attributedString
    }
}


let exampleText = """
Fugiat id blanditiis et est culpa voluptas. Vivamus aliquet enim eu blandit blandit. Sit eget praesentium maxime sit molestiae et alias aut.
"""

struct NSAttributedStringView: View {
    var body: some View {
// Note: when uncommented, the view breaks
//    ScrollView {
        TextWithAttributedString(NSAttributedString(string: exampleText))
//    }
    }
}

struct NSAttributedStringView_Previews: PreviewProvider {
    static var previews: some View {
        NSAttributedStringView()
            .previewLayout(.sizeThatFits)
    }
}

Editar: intenté usar el empaquetado UITextViewcon el textconjunto de propiedades en lugar de la attributeTextpropiedad, pero esto tampoco se procesa en el ScrollView, por lo que el problema parece ser el UITextView, no el NSAttributedString.

Entonces la pregunta es, ¿cómo hacemos que UITextViewfuncione en un ScrollView?

2 answers

5
Asperi 2020-01-24 20:17.

La razón es que SwiftUI ScrollViewrequiere un tamaño de contenido definido, pero se utiliza en UITextViewsí mismo UIScrollViewy detecta el contenido en función del espacio disponible en la vista principal. Así ocurre ciclo de tamaños indefinidos.

Aquí hay una demostración simplificada de un posible enfoque de cómo resolver esto. La idea es calcular el tamaño del contenido UITextViewy pasarlo a SwiftUI ...

struct TextWithAttributedString: UIViewRepresentable {
    @Binding var height: CGFloat
    var attributedString: NSAttributedString

    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView(frame: .zero)
        textView.isEditable = false
        return textView
    }

    func updateUIView(_ textView: UITextView, context: Context) {
        textView.attributedText = self.attributedString

        // calculate height based on main screen, but this might be 
        // improved for more generic cases
        DispatchQueue.main.async { // << fixed 
            height = textView.sizeThatFits(UIScreen.main.bounds.size).height
        }
    }
}


struct NSAttributedStringView: View {
    @State private var textHeight: CGFloat = .zero
    var body: some View {
        ScrollView {
            TextWithAttributedString(height: $textHeight, attributedString: NSAttributedString(string: exampleText))
                .frame(height: textHeight) // << specify height explicitly !
        }
    }
}
1
VictorN 2020-04-10 04:12.

Si desea utilizar Asperi TextWithAttributedString como vista secundaria, reemplace

height = textView.sizeThatFits(UIScreen.main.bounds.size).height

por

DispatchQueue.main.async {
    height = textView.sizeThatFits(textView.visibleSize).height
}

MORE COOL STUFF

Cate Blanchett se acostó con su esposo después de 3 días juntos y sigue casada con él 25 años después

Cate Blanchett se acostó con su esposo después de 3 días juntos y sigue casada con él 25 años después

Cate Blanchett desafió los consejos típicos sobre citas cuando conoció a su esposo.

Por qué Michael Sheen es un actor sin fines de lucro

Por qué Michael Sheen es un actor sin fines de lucro

Michael Sheen es un actor sin fines de lucro, pero ¿qué significa eso exactamente?

¡La estrella de Hallmark, Colin Egglesfield, habla sobre emocionantes encuentros con fans en RomaDrama Live! [Exclusivo]

¡La estrella de Hallmark, Colin Egglesfield, habla sobre emocionantes encuentros con fans en RomaDrama Live! [Exclusivo]

¡La estrella de Hallmark, Colin Egglesfield, habló sobre los emocionantes encuentros con los fanáticos en RomaDrama Live! además de su programa INSPIRE en la convención.

Por qué no puedes transmitir 'Northern Exposure' en línea

Por qué no puedes transmitir 'Northern Exposure' en línea

Tendrás que desempolvar un reproductor de Blu-ray o DVD para ver por qué Northern Exposure se convirtió en uno de los programas más populares de los 90.

Dona tu cabello para ayudar a mantener limpia nuestra agua

Dona tu cabello para ayudar a mantener limpia nuestra agua

Los recortes de cabello de los salones y las donaciones personales se pueden reutilizar como tapetes que absorben los derrames de petróleo y ayudan a proteger el medio ambiente.

Una mirada a las bodas más memorables de la Casa Blanca

Una mirada a las bodas más memorables de la Casa Blanca

Solo unas pocas personas se han casado en la Casa Blanca en los últimos más de 200 años. ¿Quiénes eran y qué se requiere para marcar una boda allí?

¿Cuál es la toronja más dulce: blanca, roja o rosada?

¿Cuál es la toronja más dulce: blanca, roja o rosada?

¿Tu boca se emociona al pensar en comer una toronja jugosa? Bueno, frunce el ceño, porque la toronja está repleta de vitaminas y antioxidantes que tu cuerpo necesita.

¿Cuál es la diferencia entre levaduras secas instantáneas y activas?

¿Cuál es la diferencia entre levaduras secas instantáneas y activas?

La levadura es el componente mágico de la cocción que hace que la masa suba. Pero hay muchos tipos por ahí. ¿Cuál es el adecuado para tu receta?

París está devolviendo el 50 por ciento de sus legendarias rotondas a la gente

París está devolviendo el 50 por ciento de sus legendarias rotondas a la gente

La Place de la Nation es una de las rotondas que se están renovando. Cuando piensa en París, probablemente piense en calles estrechas y arboladas. Pero considere algunos de sus monumentos más famosos: están rodeados por varios carriles de tráfico vehicular intenso.

Nier Designer Butts con respecto a la controversia descarada

Nier Designer Butts con respecto a la controversia descarada

[Imagen: Platinum Games] Es fácil para los fanáticos apoyarse en los personajes subiendo su propio arte en línea. Gracias al tush del protagonista de Nier: Automata 2B, Internet ciertamente ha hecho mucho de eso.

El presidente Obama realmente se va, dará un discurso de despedida en Chicago

El presidente Obama realmente se va, dará un discurso de despedida en Chicago

El presidente Barack Obama y la primera dama Michelle Obama saludan antes de abordar el Air Force One en la base de la Fuerza Aérea Andrews en Maryland el 16 de diciembre de 2016, cuando parten para sus vacaciones de Navidad en Hawái.

Nick Kyrgios dejó de importarle una mierda y se estrelló en el Abierto de Australia

Nick Kyrgios dejó de importarle una mierda y se estrelló en el Abierto de Australia

Aaron Favila / AP Muchas palabras selectas salen de la boca de Nick Kyrgios, muchas de ellas divertidas, heridas, moralistas, pero no es necesario escuchar una sola para comprender cómo se siente sobre el juego en un momento particular de hora. Puede ver eso explicado en la cancha, en la forma en que elige balancear su raqueta hacia la pelota.

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya Wishes Boyfriend Tom Holland Happy Birthday with Cuddly Photo: He 'Makes Me the Happiest'

Zendaya shared a sweet photo in honor of boyfriend Tom Holland's 26th birthday Wednesday

Emma Stone pone a la venta su casa en la playa de Cliffside Malibu por $ 4.2 millones: ¡vea el interior!

Emma Stone pone a la venta su casa en la playa de Cliffside Malibu por $ 4.2 millones: ¡vea el interior!

La casa de mediados de siglo del ganador del Oscar cuenta con tres dormitorios, dos baños y vistas al mar

Jeannie Mai Jenkins dice que "se deprimió mucho, mucho" durante su experiencia de amamantar

Jeannie Mai Jenkins dice que "se deprimió mucho, mucho" durante su experiencia de amamantar

"Te sientes tan derrotada cuando tu bebé tiene hambre que no estás produciendo lo suficiente para el bebé", dijo Jeannie Mai Jenkins sobre amamantar a su hija de 4 meses, Monaco.

La esposa de Bobby Brown, Alicia, no se enfoca en su pasado: "Bobby y Whitney fueron su momento, soy el Yin de su Yang"

La esposa de Bobby Brown, Alicia, no se enfoca en su pasado: "Bobby y Whitney fueron su momento, soy el Yin de su Yang"

La pareja de casi 10 años comparte su historia de amor antes de la nueva serie de realidad de A&E Bobby Brown: Every Little Step, que se estrenará el 31 de mayo.

Notas de inversión: Bioscout AU $ 3m Seed

Notas de inversión: Bioscout AU $ 3m Seed

Bioscout tiene la misión de poner a los agricultores en el asiento del conductor y estamos entusiasmados de respaldar al equipo en su última ronda de semillas junto con Artesian (GrainInnovate) y Uniseed. El problema La pérdida significativa de cosechas por enfermedades fúngicas ha resultado ser un calvario para los agricultores.

Pequeña investigación de mercado 1 | Quick Glimpse Telehealth Market en 2022

Pequeña investigación de mercado 1 | Quick Glimpse Telehealth Market en 2022

La telesalud no es nueva ni siquiera una vertical obsoleta en la era posterior a la pandemia. Pero cuando miramos más de cerca la industria, muestra una fuerte sostenibilidad en la demanda y la oferta y una fuerte curva de crecimiento potencial que sería una revolución constante en los EE. UU.

Clima de financiación de empresas emergentes: ¿Qué sigue para el ecosistema de empresas emergentes de Tailandia?

Clima de financiación de empresas emergentes: ¿Qué sigue para el ecosistema de empresas emergentes de Tailandia?

El año 2021 fue un año récord para la financiación de capital de riesgo (VC) a nivel mundial. El sudeste asiático no fue la excepción, ya que la región acuñó un récord de 25 nuevos unicornios en el año, según DealStreetAsia.

Más allá de la Ley de Moore

Más allá de la Ley de Moore

Existe una brecha que crece exponencialmente entre nuestro apetito por la computación y lo que puede ofrecer la Ley de Moore. Nuestra civilización se basa en la computación: debemos encontrar tecnologías que trasciendan las limitaciones actuales de la arquitectura y la imaginación.

Language