Расположение абзацев в AttributedString в SwiftUI

Вопрос или проблема

В настоящее время я переписываю приложение для чтения книг с UIKit на SwiftUI. У меня есть вопрос, и, возможно, кто-то сталкивался с этим при работе с Text в SwiftUI.

У меня есть NSMutableAttributedString, который содержит NSMutableParagraphStyle, устанавливающий paragraphSpacing.

Когда я это просматриваю в UIKit, всё отображается правильно (отступы арасма применяются). Однако, когда я оборачиваю это в AttributedString и использую в Text (SwiftUI), отступы игнорируются.

Я посмотрел документацию и заметил, что AttributedString в SwiftUI пока не поддерживает paragraphSpacing. На данный момент единственное, что я вижу в качестве обходного пути, это оставить эту часть в UIKit.

Кто-нибудь нашел способ сделать это работающим в SwiftUI?

  • проверил документацию
  • проверил git
  • проверил форумы

Ответ или решение

К сожалению, на данный момент в SwiftUI действительно нет полноценной поддержки настройки paragraphSpacing через AttributedString, что может вызывать сложности при переносе приложений с UIKit, где такие настройки доступны. Однако, существуют некоторые обходные пути, которые могут помочь вам достичь желаемого эффекта в SwiftUI.

Обходные пути для настройки отступов между абзацами в SwiftUI

  1. Использование Text с несколькими строками:
    Вместо использования AttributedString, вы можете воспользоваться массивом Text для создания текста с необходимым отступом между абзацами.

    struct ContentView: View {
       var body: some View {
           VStack(alignment: .leading, spacing: 10) { // Здесь вы можете установить spacing для отступов между абзацами
               Text("Первый абзац текста.")
               Text("Второй абзац текста.")
               Text("Третий абзац текста.")
           }
           .padding()
       }
    }
  2. Использование UIKit через UIViewRepresentable:
    Если вам необходимо сохранить форматирование текста (включая paragraphSpacing), вы можете вернуть UILabel или UITextView с использованием UIViewRepresentable, что позволит вам использовать NSMutableAttributedString как в UIKit.

    import SwiftUI
    
    struct AttributedTextView: UIViewRepresentable {
       var attributedString: NSAttributedString
    
       func makeUIView(context: Context) -> UILabel {
           let label = UILabel()
           label.numberOfLines = 0
           label.attributedText = attributedString
           return label
       }
    
       func updateUIView(_ uiView: UILabel, context: Context) {
           uiView.attributedText = attributedString
       }
    }
    
    struct ContentView: View {
       var body: some View {
           let paragraphStyle = NSMutableParagraphStyle()
           paragraphStyle.paragraphSpacing = 10 // Пример отступа
           let attributedString = NSMutableAttributedString(string: "Ваш текст здесь.\n\nЕще один абзац.")
           attributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
    
           AttributedTextView(attributedString: attributedString)
               .padding()
       }
    }
  3. Следите за обновлениями SwiftUI:
    SwiftUI активно развивается, и в следующих версиях могут быть добавлены более мощные средства для работы с атрибутированным текстом. Рекомендуется следить за обновлениями и официальной документацией для получения актуальной информации о новых функциях.

Заключение

На данный момент, для решения проблемы с отступами между абзацами в SwiftUI, вы можете воспользоваться вышеуказанными обходными путями, которые позволят вам сохранить форматирование текста. Надеюсь, это поможет вам в разработке вашего приложения. Если у вас будут дополнительные вопросы, не стесняйтесь задавать!

Оцените материал
Добавить комментарий

Капча загружается...