iphone notes.app как подчеркивание

Я искал много для подобного вопроса, и я решил спросить об этом здесь, если уже спросил, что я не мог его найти и извините.

я обнаружил, что: UITextView, как приложение iPhone Notes, которое перенаправляется сюда: http://www.cocoanetics.com/2010/03/stuff-you-learn-from-reverse-engineering-notes-app/, но в обратном инжиниринге есть не полный пример кода!?

Я создаю приложение для iphone, которое хранит и позволяет людям вводить свой текст, например notes.app в iphone. Мне нужно подчеркнуть текст, как я знаю, и мне нужно сделать это в uitextview, который является подклассом uiscrollview ..

если кто-нибудь получит какое-либо предложение сделать это, я буду счастлив ..

благодаря..

Когда мне нужно было это сделать с помощью UILabel, я создал подкласс UIView и сам реализовал собственный чертеж. Это очень подробно, но это не так сложно. В итоге я перешел в HTML-подобный синтаксис, который обрабатывался полужирным шрифтом (<b> и </ b>) и форматированием новой строки (<br>). Я думаю, вы могли бы сделать то же самое для подчеркивания, используя (<u> и </ u>).

В основном, моя техника заключалась в том, чтобы разделить строку с помощью HTML-подобных токенов (сначала плюнуть на теги «br», затем на теги «b»), а затем разделить каждую подстроку на «слова», а затем обрабатывать измерение и рисовать каждое слово самостоятельно. Если слово не вписывалось в текущую строку, я бы обернул следующую строку. Это не идеально, и он не обрабатывает много сценариев (например, новый тег линии нельзя помещать внутри жирного тега), но он работает для моих намерений.

К сожалению, я не знаю, почему форматирование текста не поддерживается в некоторых (большинство / все?) Элементов управления основным текстовым дисплеем iOS.


Редактировать / Update:
Я продолжу и добавлю подкласс UIView (замена для UILabel), который я написал. Используйте на свой риск! 🙂

MMFormattedTextView.h

 #import <UIKit/UIKit.h><br> @interface MMFormattedTextView : UIView { int InsetLeft; int InsetTop; NSString *LabelText; UIFont *LabelFont; } @property (assign, nonatomic) int InsetLeft; @property (assign, nonatomic) int InsetTop; @property (strong, nonatomic) NSString *LabelText; @property (strong, nonatomic) UIFont *LabelFont; - (NSInteger)numberOfLinesForRect:(CGRect)rect; @end 

MMFormattedTextView.m

 #import "MMFormattedTextView.h" @implementation MMFormattedTextView @synthesize InsetLeft; @synthesize InsetTop; @synthesize LabelFont; @synthesize LabelText; // LIMITATION: Each bolded section must reside IN BETWEEN <br> tags; it MAY NOT span <br> tags!!!! - (void)drawRect:(CGRect)rect { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextClearRect(ctx, rect); // Sets up the first position, which is 1 line "off the top", // adjusted so that the text will be centered when it's all drawn CGFloat howManyLinesWouldFit = rect.size.height / [[self LabelFont] lineHeight]; NSInteger howManyLinesDoWeHave = [self numberOfLinesForRect:rect]; CGFloat lineOffset = (howManyLinesWouldFit - howManyLinesDoWeHave) / 2.0; CGPoint topLeft = CGPointMake([self InsetLeft], [self InsetTop] - [[self LabelFont] lineHeight] + (lineOffset * [[self LabelFont] lineHeight])); // Split the text into hard-split lines (actual <br> tags in the text) NSArray *lines = [[self LabelText] componentsSeparatedByString:@"<br>"]; // Iterate through each hard-coded line for (NSString *line in lines) { // Iterate to the next line topLeft = CGPointMake([self InsetLeft], topLeft.y + [[self LabelFont] lineHeight]); NSArray *pieces = [line componentsSeparatedByString:@"<b>"]; BOOL bold = YES; for (NSString *piece in pieces) { bold = !bold; UIFont *fontToUse; if (bold) { fontToUse = [UIFont boldSystemFontOfSize:[[self LabelFont] pointSize]]; } else { fontToUse = [UIFont systemFontOfSize:[[self LabelFont] pointSize]]; } NSArray *words = [piece componentsSeparatedByString:@" "]; for (NSString *word in words) { if ([word isEqualToString:@""]) continue; NSString *wordWithSpace = [NSString stringWithFormat:@"%@ ", word]; CGSize wordSize = [wordWithSpace sizeWithFont:fontToUse]; if ((topLeft.x + wordSize.width) > (rect.size.width - [self InsetLeft])) { // This runs off this line, so go to the next line topLeft = CGPointMake([self InsetLeft], topLeft.y + [[self LabelFont] lineHeight]); } [wordWithSpace drawAtPoint:topLeft withFont:fontToUse]; topLeft = CGPointMake(topLeft.x + wordSize.width, topLeft.y); } } } } - (NSInteger)numberOfLinesForRect:(CGRect)rect { int retVal = 0; int left = [self InsetLeft]; NSArray *lines = [[self LabelText] componentsSeparatedByString:@"<br>"]; // Iterate through each hard-coded line for (NSString *line in lines) { // Iterate to the next line retVal = retVal + 1; left = [self InsetLeft]; NSArray *pieces = [line componentsSeparatedByString:@"<b>"]; BOOL bold = YES; for (NSString *piece in pieces) { bold = !bold; UIFont *fontToUse; if (bold) { fontToUse = [UIFont boldSystemFontOfSize:[[self LabelFont] pointSize]]; } else { fontToUse = [UIFont systemFontOfSize:[[self LabelFont] pointSize]]; } NSArray *words = [piece componentsSeparatedByString:@" "]; for (NSString *word in words) { if ([word isEqualToString:@""]) continue; NSString *wordWithSpace = [NSString stringWithFormat:@"%@ ", word]; CGSize wordSize = [wordWithSpace sizeWithFont:fontToUse]; if ((left + wordSize.width) > (rect.size.width - [self InsetLeft])) { // This runs off this line, so go to the next line retVal = retVal + 1; left = [self InsetLeft]; } left = left + wordSize.width; } } } return retVal; } @end