NSLayoutManager возвращает неверный индекс символов при нажатии на текст LTR в тексте с атрибутом RTL - PullRequest
1 голос
/ 15 марта 2020

Я написал код, чтобы определить, касается ли пользователь определенного диапазона c в UILabel. Кажется, в большинстве случаев это работает, но я заметил, что нажатие на последнюю строку атрибутивного текста приводит к противоречивым результатам.

public static bool DidTapRange(this UITapGestureRecognizer recognizer, UILabel label, NSRange range)
{
    using (var ts = new NSTextStorage())
    {
        var lm = new NSLayoutManager();
        var tc = new NSTextContainer(new CGSize(label.Frame.Width, double.MaxValue));

        lm.AddTextContainer(tc);
        ts.Append(label.AttributedText);
        ts.AddLayoutManager(lm);

        tc.LineFragmentPadding = (float) 0.0;
        tc.LineBreakMode = label.LineBreakMode;
        tc.MaximumNumberOfLines = (uint) label.Lines;
        tc.Size = label.Bounds.Size;

        var index = lm.GetCharacterIndex(recognizer.LocationOfTouch(0, label), tc); 
        return (nint)index >= range.Location && (nint)index < range.Location + range.Length;
     }
}

У меня особенно возникают проблемы с текстом RTL и при смешанном тексте LTR с этим. Например, если я добавляю текст LTR в конец текста RTL и нажимаю на него (в приведенном ниже случае TapMe), приведенный выше код возвращает неверный индекс символов и возвращает false для проверки диапазона.

عندما يريد العالم أن يتكلّم ، فهو يتحدّث بلغة يونيكود. تسجّل الآن لحضور المؤتمر الدولي العاشر ليونيكود (Unicode Conference) ، الذي سيعقد في 10-12 января 1997 года بمدينة مَايِنْتْس و سيجمع المؤتمر بين خبراء من كافة قطاعات الصناعة على الشبكة العالمية انترنيت ويونيكود, حيث ستتم, على الصعيدين الدولي والمحلي على حد سواء مناقشة سبل استخدام يونكود في النظم القائمة وفيما يخص التطبيقات الحاسوبية, الخطوط, تصميم النصوص والحوسبة متعددة اللغات ... TapMe

Что может быть причиной этого?

...