Como usar um NSAttributedString com um ScrollView no SwiftUI?

4
sbdchd 2020-01-24 14:43.

Consegui renderizar NSAttributedStrings via, o UIViewRepresentableque funciona muito bem até envolver a visualização em a ScrollView.

Quando colocado dentro do ScrollView, a NSAttributedStringvisualização para de renderizar.

Tentei alguns outros métodos que substituem um NSAttributedStringcom a adição de várias Text()visualizações juntas para obter a formatação que funciona dentro de ScrollViewe suporta itálico e monospace font. Infelizmente, isso não funciona para links dentro de blocos de texto, o que significa que ainda preciso de um 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)
    }
}

Edit: Tentei usar o empacotado UITextViewcom a textpropriedade definida em vez da attributeTextpropriedade, mas isso também não consegue renderizar no ScrollView, então o problema parece ser o UITextView, não o NSAttributedString.

Portanto, a questão é: como podemos fazer o UITextViewtrabalho funcionar em um ScrollView?

2 answers

5
Asperi 2020-01-24 20:17.

O motivo é que o SwiftUI ScrollViewrequer um tamanho de conteúdo definido, mas o UITextViewpróprio é um UIScrollViewe detecta o conteúdo com base no espaço disponível na visualização pai. Assim acontece ciclo de tamanhos indefinidos.

Aqui está uma demonstração simplificada de uma possível abordagem de como resolver isso. A ideia é calcular o tamanho do conteúdo UITextViewe passá-lo para o 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.

Se você quiser usar o Asperi's TextWithAttributedString como uma visão filha, substitua

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

de

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

MORE COOL STUFF

A 1ª temporada de 'quarta-feira' tem um grande mistério no centro

A 1ª temporada de 'quarta-feira' tem um grande mistério no centro

'Quarta-feira' da Netflix é mais do que apenas o típico drama adolescente, na verdade, a primeira temporada tem um grande mistério no centro.

Especialista em linguagem corporal aponta movimento sutil de Kate Middleton que permitiu que Camilla Parker Bowles brilhasse durante a visita de estado

Especialista em linguagem corporal aponta movimento sutil de Kate Middleton que permitiu que Camilla Parker Bowles brilhasse durante a visita de estado

Kate Middleton não queria tirar os holofotes de Camilla Parker Bowles durante o jantar de estado e a visita de estado, diz um especialista.

Por que alguns fãs esperam que a pausa 'muito amigável' de Harry Styles e Olivia Wilde seja permanente

Por que alguns fãs esperam que a pausa 'muito amigável' de Harry Styles e Olivia Wilde seja permanente

Descubra por que alguns fãs esperam que Olivia Wilde torne permanente a separação 'difícil', mas 'muito amigável' entre ela e Harry Styles.

Kate Middleton ainda está passando por 'um momento muito difícil' desde a morte da rainha Elizabeth, revela especialista real 

Kate Middleton ainda está passando por 'um momento muito difícil' desde a morte da rainha Elizabeth, revela especialista real&nbsp;

Descubra por que Kate Middleton estava tendo um 'momento muito difícil' nos bastidores após a morte da rainha Elizabeth II.

Subir a escada de Jacob em Santa Helena não é para os fracos de coração

Subir a escada de Jacob em Santa Helena não é para os fracos de coração

A escada de Jacob na ilha de Santa Helena tem 699 degraus de escalada direta, tão difícil que você ganha um certificado se chegar ao topo.

The Secrets of Airline Travel Quiz

The Secrets of Airline Travel Quiz

Air travel is far more than getting from point A to point B safely. How much do you know about the million little details that go into flying on airplanes?

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

A Lei do Ar Limpo está sendo contestada. A SCOTUS irá protegê-la?

A Lei do Ar Limpo está sendo contestada. A SCOTUS irá protegê-la?

Um caso atualmente sendo decidido pela Suprema Corte pode limitar o escopo de autoridade que o Congresso pode dar à EPA, incluindo a Lei do Ar Limpo. Por que isso importa?

As armas especiais de Bard's Tale IV também são quebra-cabeças

As armas especiais de Bard's Tale IV também são quebra-cabeças

Os quebra-cabeças da série The Room são partes iguais cativantes e assustadores, mas têm apenas um problema: você não pode usá-los para matar alguém depois de resolvê-los. The Bard's Tale IV inspira-se na Sala, mas com armas em vez de salas.

Por que as avaliações "incentivadas" da Amazon são tendenciosas, mesmo que afirmem que não são

Por que as avaliações "incentivadas" da Amazon são tendenciosas, mesmo que afirmem que não são

A Amazon só permite que os comerciantes dêem amostras grátis de produtos aos usuários se eles divulgarem esse fato em sua análise. Normalmente, esses revisores afirmam que foram solicitados a fazer uma avaliação “honesta”.

O melhor cavaleiro das trevas retorna o brinquedo do Batman ficou ainda mais fresco

O melhor cavaleiro das trevas retorna o brinquedo do Batman ficou ainda mais fresco

A figura do Dark Knight Returns do Batman de Mezco com 6,5 ”de altura já é uma das melhores interpretações do Batman em forma de figura.

Campos de batalha de PlayerUnknown: The Kotaku Review

Campos de batalha de PlayerUnknown: The Kotaku Review

O campo de batalha de PlayerUnknown é simples. Coloque 100 jogadores em um mapa, diga a eles que apenas uma pessoa pode vencer e observe-os se separando.

Eu usei este sutiã pegajoso de apoio que não me decepcionou pelo menos 30 vezes - e agora está à venda

Eu usei este sutiã pegajoso de apoio que não me decepcionou pelo menos 30 vezes - e agora está à venda

O sutiã pegajoso Gatherall é o melhor que encontrei graças ao seu design de suporte para os tamanhos A a DD. Feito de silicone adesivo de grau médico, este essencial sem costas, sem alças e reutilizável é perfeito para se vestir nas férias. E até 28 de novembro, 20% de desconto com o código GATHERNOW

Demi Lovato compartilha o conselho que daria às jovens estrelas da Disney hoje: 'Vá com calma'

Demi Lovato compartilha o conselho que daria às jovens estrelas da Disney hoje: 'Vá com calma'

"Estávamos todos trabalhando muito duro, correndo para o chão", disse Demi Lovato sobre seus dias na Disney

Melancias esmagadas em acidente doadas para um resgate de animais selvagens para encantar e hidratar animais

Melancias esmagadas em acidente doadas para um resgate de animais selvagens para encantar e hidratar animais

A Yak's Produce doou dezenas de melões para a especialista em reabilitação de vida selvagem Leslie Green e os 42 animais que vivem em seu resgate na Louisiana

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

8 ideias simples de configuração de home office para aumentar a produtividade do seu trabalho

8 ideias simples de configuração de home office para aumentar a produtividade do seu trabalho

Dominando a arte da configuração do home office! Os desenvolvedores AppExert dominam a arte de trabalhar em casa, mesmo quando toda a família permanece junta. Isso nos levou de volta à memória de quando nossos avós ou bisavós viviam em famílias conjuntas.

Em 2022, onde termina nossa vida digital e começa a 'vida real'?

Um viajante do tempo de até vinte anos atrás ficaria surpreso com a importância que atribuímos aos serviços digitais e baseados na Internet em nossa vida cotidiana. Plataformas como MySpace, eBay e Napster nos mostraram uma janela do que poderia ser um mundo focado em se tornar mais rápido.

Dia do Sistema de Informação Geográfica: Melhores Pilhas de Tecnologia para aprender como Desenvolvedor GIS

Dia do Sistema de Informação Geográfica: Melhores Pilhas de Tecnologia para aprender como Desenvolvedor GIS

Para uma compreensão robusta do mundo em que vivemos, precisamos de dados. No entanto, na ausência de referência espacial, esses dados podem se tornar inúteis sem contexto geográfico.

Viver na Mente e Viver com a Mente

Viver na Mente e Viver com a Mente

Apesar de viver no mesmo mundo porque algumas pessoas são calmas e outras ágeis? Por que algumas pessoas são distintamente criativas do que outras, embora vivam no mesmo mundo? Por que alguns indivíduos perdoam facilmente, enquanto outros não, enquanto residem no mesmo mundo? Muitas perguntas semelhantes surgem em nossa mente e as deixamos sem pesquisa ou as procuramos nos livros. Existem muitas diferenças entre saber e entender uma resposta dos livros e ter a resposta por experiência ou por dentro.

Language