NSLayoutManager returns incorrect character index when tapping on LTR text in RTL attributed text

僤鯓⒐⒋嵵緔 提交于 2021-01-28 08:51:58

问题


I wrote code to detect if the user taps within a specific range in UILabel. It seems to be working in most cases, but I have noticed that tapping the last line of an attributed text creates inconsistent results.

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;
     }
}

I'm particularly having issues with RTL text and when LTR text is mixed with it. For example, if I append LTR text to the end of RTL text and tap on it (in the below case TapMe), the above code returns an incorrect character index and returns false for the range check.

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

What could be the cause for this?

来源:https://stackoverflow.com/questions/60688083/nslayoutmanager-returns-incorrect-character-index-when-tapping-on-ltr-text-in-rt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!