Я нашел идеальное решение этой проблемы в Apple Text Layout Guide по программированию . Вот решение, которое предлагает Apple:
NSLayoutManager *layoutManager = [textView layoutManager];
unsigned numberOfLines, index;
unsigned numberOfGlyphs = [layoutManager numberOfGlyphs];
NSRange lineRange;
for (numberOfLines = 0, index = 0; index < numberOfGlyphs; numberOfLines++){
(void) [layoutManager lineFragmentRectForGlyphAtIndex:index effectiveRange:&lineRange];
index = NSMaxRange(lineRange);
}
Это можно легко записать в расширение для UITextView или в качестве автономного метода, принимающего объект UITextView в качестве параметра
Так почему же вы думаете, что простой (конкат. Транспонированный) «недостаточно хорош»? Я предполагаю, что вы пробовали что-то вроде:
merge :: [[a]] -> [a]
merge = concat . transpose
merge2 :: [a] -> [a] -> [a]
merge2 l r = merge [l,r]
Таким образом, вы можете избежать явной рекурсии (против первого ответа), и все же это проще, чем второй ответ. Так в чем же недостатки?