问题
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