Pull to refresh

UITextView с картинками

Reading time2 min
Views3.7K
Недавно возникла необходимость дать пользователям возможность добавлять статьи с iPhone`а с фотографиями, произвольно размещенными внутри текста. К сожалению, такого функционала sdk не предоставляет, поэтому пришлось изобретать велосипед.

Первоначально поискав решения наткнулся на такую возможность при отправке e-mail`а, там используется некий компонент UITextContentView, который можно отлично использовать, вставлять туда фотографии из буфера обмена и редактировать как захочется. Проблема возникла с получением этих фотографий обратно в программу, недокументированный метод contentAsHTMLString возвращал содержимое в хтмл-виде, но ссылки на картинки были вида webkit-fake-url, получить картинку имея на руках такого вида ссылку не получилось.

Хочу поделиться своим решением возникшей проблемы (спасибо пользователю [info]igrick за совет в реализации)

Реализовано следующим образом: в корне расположен UIScrollView, в него добавляется UITextView (MyTextView в примере — отлючена функция скроллинга внутри поля), при вставке изображения добавляется UIImageView ниже выбранного в данный момент текстового поля, и еще ниже еще один MyTextView. Таким образом можно редактировать текст до и после изображения.
Отдельно обрабатывается случай, когда пользователь, находясь в нулевой позиции текстового поля, нажимает Backspace — при этом удаляется изображение, а два текстовых поля (до изображения и после) склеиваются в одно.

Для получения введенного пользователем текста используется метод:
 NSString *text = textView.text;

* This source code was highlighted with Source Code Highlighter.

Изображения в тексте заменяются на строки вида [img1], [img2]… где число — (номер изображения + 1) в массиве, который можно получить методом
NSArray *images = [textView getImages];

* This source code was highlighted with Source Code Highlighter.


При редактировании статьи нужна обратная операция — вставка текста с картинками в компонент для последующего редактирования.
Эту часть необходимо будет «допиливать» под ваши нужны. В моем случае все теги изображений были в виде <img src="/images/..." width=«300» >, поэтому я сделал просто — замена всех таких тегов на [[«url изображения»]] и реализовал метод
[textView setText:parsedText baseUrl:[NSURL URLWithString:@"http://www.site.ru/"]];

* This source code was highlighted with Source Code Highlighter.


Для использования компонента достаточно скопировать 4 файла (находящихся в группе UITextViewWithImages в примере) в свой проект, в Interface Builder`е добавить в вид UIScrollView и в «Identity Inspector» поменять «Class» на «UITextViewWithImages»

В примере реализован базовый функционал, из недостатков могу отметить невозможность вставить изображение «внутрь» текстового поля между уже введенными строками

Собственно сама ссылка на пример с исходниками
Tags:
Hubs:
Total votes 18: ↑13 and ↓5+8
Comments10

Articles