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


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


        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?

Source: Ios

Categorised as ios, nslayoutmanager, uilabel, xamarin, xamarin.ios


Leave a Reply

Your email address will not be published. Required fields are marked *

Still Have Questions?

Our dedicated development team is here for you!

We can help you find answers to your question for as low as 5$.

Contact Us