iOS: NSMutableAttributedString.AddAttributes не отображается. (Xamarin) - PullRequest
2 голосов
/ 07 марта 2020

Я пытаюсь изменить стиль ссылки в UILabel в Xamarin. iOS. Я написал следующий код, и NSMutableAttributedString обновляется правильно. Однако обновленный стиль не отображается. Я что-то упустил?

Я тестирую на симуляторе iOS.

mutableHtmlString.EnumerateAttribute(linkAttributeName, new NSRange(0, mutableHtmlString.Length), NSAttributedStringEnumeration.LongestEffectiveRangeNotRequired,
    (NSObject value, NSRange range, ref bool stop) =>
    {
        var attrHyperlink = new UIStringAttributes
        {
            UnderlineStyle = NSUnderlineStyle.None,
            ForegroundColor = UIColor.Red,
        };

        if (value != null && value is NSUrl url)
        {
            mutableHtmlString.AddAttributes(attrHyperlink, range);
            System.Diagnostics.Debug.WriteLine(@$"XXX: {mutableHtmlString}");
        }               
    });
control.AttributedText = mutableHtmlString;

NSUnderlineStyle.PatternDa sh отображается правильно. Также KerningAdjustment и UnderlineColor.

Это ограничение UILabel?

1 Ответ

1 голос
/ 13 марта 2020

от Apple : для обеспечения согласованности предполагаемое поведение предназначено для диапазонов, представляющих ссылки (указанные через NSLinkAttributeName), которые должны отображаться с использованием внешнего вида ссылки по умолчанию. Таким образом, текущее поведение - это ожидаемое поведение.

Таким образом, это означает, что это ограничение UILabel и оно преднамеренное.

Однако есть обходной путь. Просто замените NSLink пользовательским атрибутом.

mutableHtmlString.EnumerateAttribute(linkAttributeName, new NSRange(0, mutableHtmlString.Length), NSAttributedStringEnumeration.LongestEffectiveRangeNotRequired,
    (NSObject value, NSRange range, ref bool stop) =>
    {
        var attrHyperlink = new UIStringAttributes
        {
            UnderlineStyle = NSUnderlineStyle.None,
            ForegroundColor = UIColor.Red,
        };

        if (value != null && value is NSUrl url)
        {
            mutableHtmlString.AddAttribute(customAttributeName, value, range);
            mutableHtmlString.RemoveAttribute("NSLink", range);
            mutableHtmlString.AddAttributes(attrHyperlink, range);
        }               
    });
control.AttributedText = mutableHtmlString;

Вы можете использовать customAttributeName, чтобы найти строку при необходимости.

Благодаря https://exceptionshub.com/color-attribute-is-ignored-in-nsattributedstring-with-nslinkattributename.html

...