Добавление контура/штриха в UITextView

Я хочу добавить контур или штрих к редактируемому UITextView тексту по мере ввода пользователем. Точно как мемы: http://t.qkme.me/3oi5rs.jpg

введите здесь описание изображения

Я должен использовать UITextView, так как мне нужна поддержка нескольких линий. Я перепробовал все подходы и пришел к выводу, что я должен использовать CoreText. Я заработал почти все решение, но застрял в точке, где текст в текстовом виде переносится. Моя подпрограмма drawRect в subview из UITextView правильно рисует контурный текст до тех пор, пока текст не переносится. Даже когда текст, вводимый пользователем, переносится, контурный текст, который я рисую, не переносится. Вот моя реализация метода drawRect: https://gist.github.com/4498988. В строке 29 я использую перенос символов:

CTLineBreakMode linebreakmode = kCTLineBreakByCharWrapping;

Я уже пробовал вариант переноса слов (который также используется по умолчанию) безрезультатно.

Мой вопрос: как мне заставить текст, который я рисую, правильно обернуть, чтобы он отображался как контур печатного текста?


person trunal bhanse    schedule 10.01.2013    source источник
comment
Что происходит не так? Какой у Вас вопрос?   -  person user1118321    schedule 10.01.2013
comment
Я тоже не понимаю вопроса. Как насчет того, чтобы просто затенить текст??   -  person Tommy Devoy    schedule 10.01.2013
comment
Извините, обновил исходный вопрос, чтобы быть более ясным.   -  person trunal bhanse    schedule 10.01.2013
comment
@ttarules, мне нужно добавить контур к каждому набранному символу, а не ко всему тексту. хотя спасибо за предложение!   -  person trunal bhanse    schedule 10.01.2013


Ответы (3)


Просто создайте строку с помощью CSS

NSString *htmlstring = [[NSString alloc] initWithFormat:@"<html><font style=\"text-shadow: 0 0 0.2em #F87, 0 0 0.2em #F87\">%@</font></html>", YourTextView.text, nil];

^ Это сделает любой текст в свечении TextView прочитанным на веб-странице. (Вы также можете сделать его черным фоном, если хотите... используйте это:

NSString *htmlstring = [[NSString alloc] initWithFormat:@"<html><body bgcolor=\"#000000\"><font style=\"text-shadow: 0 0 0.2em #F87, 0 0 0.2em #F87\">%@</font></body></html>", YourTextView.text, nil];

Теперь сохраните его как файл html и загрузите в UIWebView. Или введите его в URL-адрес через javascript и загрузите этот URL-адрес в UIWebView.

Установите кадр и местоположение UIWebView так, чтобы они соответствовали вашему UITextView, чтобы он располагался поверх него, и отображался светящийся красным текст с черным фоном.

person Albert Renshaw    schedule 10.01.2013
comment
Спасибо, Альберт, но я хочу обновлять UITextView в режиме реального времени, когда пользователь печатает. Похоже, ваше решение потребует от меня разместить UIWebView после того, как пользователь закончит редактирование? - person trunal bhanse; 10.01.2013
comment
Вы можете отключить UIWebView, чтобы пользователи могли щелкнуть его и начать печатать, и он будет обновляться автоматически (потому что время загрузки практически отсутствует, потому что html-файл хранится локально, поэтому вам не нужен WiFi или что-то еще, чтобы получить его) вы можете добавить мигающую синюю линию в конце, чтобы имитировать, что UIWebView является UITextView, и это будет выглядеть очень реалистично, тогда WebView может обновляться в реальном времени. Единственным препятствием будет попытка переместить курсор обратно в предыдущую часть вашего текста или попытаться выбрать текст для копирования/вставки... это не сработает /: - person Albert Renshaw; 10.01.2013
comment
Если бы вы могли каким-то образом сделать текст в UITextView прозрачным, вы могли бы поместить текстовое представление сверху, и тогда пользователи по-прежнему видели бы мигающую синюю линию для текущего местоположения курсоров, и пользователи могли бы свободно редактировать, как если бы это было настоящее текстовое представление, даже если они видят UIWebView. - person Albert Renshaw; 10.01.2013
comment
ОЙ!!!! Или просто создайте UITextView с помощью html, и они отредактируют веб-страницу... вы можете передать переменные через javascript! Тогда это будет похоже на редактирование UITextView, но они будут редактировать TextArea на поддельном веб-сайте в вашем приложении с красным светящимся текстом! - person Albert Renshaw; 10.01.2013
comment
^Конечно, это лучшее решение из моих 3. Удачи! Бог благословил! - person Albert Renshaw; 10.01.2013
comment
Добавлен новый ответ, который будет работать! Проверьте это :) Это выше этого ответа. Удачи! - person Albert Renshaw; 10.01.2013

Создайте файл HTML с красным светящимся текстом в редактируемом текстовом поле (TextArea).

Сделайте фон всех элементов прозрачным.

Превратите его в строку и загрузите в UIWebView, который находится поверх изображения, на которое вы хотите поместить текст.

Загрузите строку HTML в UIWebView, а также сделайте сам UIWebView прозрачным.

* Также вам может понадобиться сделать свой UIWebView свойством и синтезировать его.

Вот код (без синтеза и свойства)

.h:

@interface ViewController : UIViewController <uiwebviewdelegate></uiwebviewdelegate> {
    IBOutlet UIWebView *webView;
    //... other objects you already have can go here too..
}

.m:

self.webView.delegate = self;
NSString *htmlstring = [[NSString alloc] initWithFormat:@"<html><body style='background-color: transparent;'><textarea name='myTextArea'cols='20' rows='10' style='text-shadow: 0 0 0.2em #F87, 0 0 0.2em #F87; background-color:transparent; border:none'>You Can Edit This Text.</textarea></body></html>"];
[self.webView loadHTMLString:htmlstring baseURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] bundlePath]]];
self.webView.opaque = NO;
self.webView.backgroundColor = [UIColor clearColor];

Изменить: вот код свойства и синтез "webView"

@property(nonatomic,retain)IBOutlet UIWebView *nubrowser; //put in .h file at end of "@Interface" function after the closing curly bracket ("}")

@synthesize webView; //put in .m file directly after "@implementation" function
person Albert Renshaw    schedule 10.01.2013
comment
Измените размер шрифта, цвет свечения и все остальное в файле innerHTML htmlstring. Не забудьте синтезировать свой UIWebView и сделать его свойством, если вы планируете использовать его с другими вещами. - person Albert Renshaw; 10.01.2013
comment
* Обратите внимание: если вы хотите, чтобы html TextArea прокручивался, как UITextView, вам нужно будет добавить свойство CSS, я не могу вспомнить его в данный момент, но его довольно просто найти в Google... это похоже на переполнение: сенсорный -прокрутка или что-то в этом роде. - person Albert Renshaw; 10.01.2013
comment
^ Вам это не понадобится, это просто для других людей в будущем, которые захотят использовать этот метод для чего-то другого, кроме размещения текста поверх фотографии... - person Albert Renshaw; 10.01.2013
comment
** Примечание 2: чтобы получить текст из TextArea html, передайте переменные из innerHTML.myTextArea через Javascript (это можно легко найти в Google, если вы не знаете, как это сделать) - person Albert Renshaw; 10.01.2013
comment
*** Примечание 3: вам может не понадобиться использовать self.webView, если вы определили webView в своем viewController .h, просто используйте webView, а не self.webView - person Albert Renshaw; 11.01.2013

person    schedule
comment
Не могли бы вы отредактировать свой ответ, чтобы объяснить, почему этот код отвечает на вопрос? Ответы, содержащие только код, не рекомендуются, поскольку они не учат решению. - person DavidPostill; 06.04.2015