Настройте встроенную гиперссылку в UITextView с помощью Swift iOS13

После установки iOS13 расширение UITextView настраивает только фон (на белый цвет) вокруг самого текста, а не всего UITextView.

Как я могу убедиться, что цвет фона всего объекта UITextview изменен на белый?

введите здесь описание изображения

Расширение:

extension UITextView {


    func hyperLink(originalText: String, hyperLink: String, urlString: String) {

        let style = NSMutableParagraphStyle()
        style.alignment = .center

        let attributedOriginalText = NSMutableAttributedString(string: originalText)
        let linkRange = attributedOriginalText.mutableString.range(of: hyperLink)
        let fullRange = NSMakeRange(0, attributedOriginalText.length)
        attributedOriginalText.addAttribute(NSAttributedString.Key.link, value: urlString, range: linkRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: fullRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.foregroundColor, value: UIColor.black, range: fullRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.backgroundColor, value: UIColor.white, range: fullRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 11), range: fullRange)

        self.linkTextAttributes = [
            kCTForegroundColorAttributeName: UIColor.black,
            kCTUnderlineStyleAttributeName: NSUnderlineStyle.single.rawValue,
            ] as [NSAttributedString.Key : Any]

        self.attributedText = attributedOriginalText

    }//end func
}

Применение:

class LoginVC: UIViewController {

    @IBOutlet weak var disclaimerTextView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()

        disclaimerTextView.hyperLink(originalText: "By continuing, you agree to our Terms and Privacy Policy found on our website", hyperLink: "website", urlString: WEBSITE_URL)

    }
}

EDIT: вывод предлагаемого решения - не работает.

введите здесь описание изображения


person Roggie    schedule 26.09.2019    source источник
comment
Вы хотите, чтобы часть гиперссылки была подчеркнута, а остальные выглядели нормально, вроде UILabel над ней?   -  person David Chopin    schedule 26.09.2019
comment
Кроме того, вы хотите, чтобы гиперссылка была того же цвета, что и остальной текст с атрибутами?   -  person David Chopin    schedule 26.09.2019
comment
@DavidChopin да, я хочу, чтобы часть гиперссылки была подчеркнута, а остальные выглядели нормально, как UILabel над ней. Так было до установки iOS13. Кроме того, да, я также хочу, чтобы гиперссылка была того же цвета текста, за исключением того, что она подчеркнута.   -  person Roggie    schedule 26.09.2019
comment
Я собираюсь посмотреть, смогу ли я придумать для вас функцию расширения, которая работает на iOS 13.   -  person David Chopin    schedule 26.09.2019


Ответы (1)


Изменение расширения на это:

extension UITextView {
    func hyperLink(originalText: String, hyperLink: String, urlString: String) {

        let style = NSMutableParagraphStyle()
        style.alignment = .center

        let attributedOriginalText = NSMutableAttributedString(string: originalText)
        let linkRange = attributedOriginalText.mutableString.range(of: hyperLink)
        let fullRange = NSMakeRange(0, attributedOriginalText.length)
        attributedOriginalText.addAttribute(NSAttributedString.Key.link, value: urlString, range: linkRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.paragraphStyle, value: style, range: fullRange)
        attributedOriginalText.addAttribute(NSAttributedString.Key.font, value: UIFont.systemFont(ofSize: 11), range: fullRange)

        self.linkTextAttributes = [
            kCTForegroundColorAttributeName: UIColor.black,
            kCTUnderlineStyleAttributeName: NSUnderlineStyle.single.rawValue,
            ] as [NSAttributedString.Key : Any]

        self.attributedText = attributedOriginalText

    }
}

Работает на меня. Я просто удалил атрибуты текста с атрибутами, которые изменили цвета переднего плана и фона. Я не уверен, почему они были там с самого начала.

person David Chopin    schedule 26.09.2019
comment
не работает, у меня черный фон. Изменили ли вы iOS Deployment Target = iOS 13.0 в настройках сборки вашего проекта? - person Roggie; 26.09.2019
comment
Я обновил свой вопрос скриншотом вывода предложенного вами ответа, чтобы вы могли видеть. - person Roggie; 26.09.2019
comment
У меня установлено развертывание 13, но я не получаю такого поведения. Можете ли вы попробовать прокомментировать нашу строку, в которой вы называете disclaimerTextView.hyperLink(originalText:, hyperLink:, urlString:)? Просто чтобы убедиться, что функция действительно вызывает такое поведение - person David Chopin; 26.09.2019
comment
Я прокомментировал это и получил такое же поведение, затем я изменил цвет «фона» с «белого» на «очистить» из раскадровки, раскомментировал строку, перезапустил, и теперь он работает. :) - person Roggie; 26.09.2019
comment
спасибо за вашу помощь, похоже, проблема была вызвана настройкой цвета фона в раскадровке, так как мое исходное расширение также работает, лол :) - person Roggie; 26.09.2019
comment
Все хорошо :) иногда нам просто нужен второй мозг, чтобы замечать очевидные вещи. Я подумал, что это как-то связано с созданием интерфейсов. - person David Chopin; 26.09.2019
comment
@DavidChopin Можете ли вы помочь мне решить эту проблему в iOS13. Я пробовал все возможные способы, но безуспешно... stackoverflow.com/questions/58405106/ - person Aslam; 21.10.2019
comment
К сожалению, @IosDeveloper, я плохо разбираюсь в UIGraphicsBeginImageContextWithOptions. Я понимаю, что он делает (создает изображение из вещей, отображаемых на экране), но раньше я использовал его только с UITableView. И даже тогда это был в основном процесс копирования и вставки. Вы не думали назначить за это награду? - person David Chopin; 21.10.2019