【问题标题】:iphone notes.app like underlineiphone notes.app 喜欢下划线
【发布时间】:2012-05-09 16:12:07
【问题描述】:

我已经搜索了很多类似的问题,我决定在这里问这个问题,如果已经问过,我找不到它,抱歉。

我发现:UITextView like iPhone Notes application 重定向到这里:http://www.cocoanetics.com/2010/03/stuff-you-learn-from-reverse-engineering-notes-app/ 但在逆向工程中没有完整的代码示例!?

我正在为 iphone 创建一个应用程序,该应用程序存储并允许人们在 iphone 中输入他们的文本,如 notes.app。据我所知,我需要在文本下划线,我需要在 uitextview 中进行,这是 uiscrollview 的子类 ..

如果有人有任何建议,我会很高兴..

谢谢..

【问题讨论】:

    标签: ios xcode uitextview underline


    【解决方案1】:

    当我需要使用 UILabel 执行此操作时,我创建了 UIView 的子类并自己实现了自定义绘图。它非常详细,但并不那么复杂。我最终传递了处理粗体()和换行符(
    )格式的类似HTML 的语法。我认为您可以使用 ( 和 u >) 对下划线做同样的事情。

    基本上,我的技术是使用类似 HTML 的标记(首先在“br”标签上,然后在“b”标签上)拆分字符串,然后将每个子字符串拆分为“单词”,然后处理测量和单独绘制每个单词。如果一个单词不适合当前行,我会换行到下一行。它并不完美,它不能处理很多场景(例如,新的行标签不能放在粗体标签内),但它符合我的意图。

    不幸的是,我不知道为什么某些(大多数/全部?)iOS 基本文本显示控件没有更好地支持文本格式。


    编辑/更新:
    我将继续添加我编写的 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
    

    【讨论】:

    • 是的,我已经尝试在我的程序中使用 html,但它似乎有点像一种解决方法。我正在尝试找出是否有针对该问题的第 3 方本土解决方案.. :)
    • 嗯,你可以试试 UIWebView 路由,这个路由很慢很烦我。或者,您可以尝试将three20 组件库实现到您的应用程序中。我开始走这条路,事实证明让他们的代码工作比简单地编写我自己的代码更复杂!他们的库又大又复杂,这超出了我在 UILabel 中需要部分下划线的需要。
    • 另外,我实现了 pseudo-HTML 代码,而不是真正的 HTML。我只是认为在这些标签上拆分我的字符串相当容易,我确信标签文本中不存在这些标签。我还没有做任何实际解析 HTML 的事情。
    猜你喜欢
    • 1970-01-01
    • 2012-09-04
    • 2011-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多