6

UITextViewユーザーが入力するときに、編集可能なテキストにアウトラインまたはストロークを追加したいと考えています。まさにミームのように: http://t.qkme.me/3oi5rs.jpg

ここに画像の説明を入力

UITextView複数行のサポートが必要なため、 a を使用する必要があります。私はすべてのアプローチを試し、使用しなければならないという結論に達しましたCoreText。ほとんどすべてのソリューションが機能しましたが、テキストビューのテキストが折り返された時点で行き詰まりました。の私のdrawRectルーチンは、テキストが折り返されるまでアウトライン テキストsubviewを正しく描画します。UITextViewユーザーが入力したテキストが折り返されていても、私が描いたアウトライン テキストは折り返されません。drawRectメソッドの実装は次のとおりです: https://gist.github.com/4498988。29 行目で、char ラッピングを使用しています。

CTLineBreakMode linebreakmode = kCTLineBreakByCharWrapping;

wordwrap オプション (これもデフォルト) は既に試しましたが、使用できませんでした。

私の質問は次のとおりです。入力したテキストのアウトラインとして表示されるように、描画したテキストを正しく折り返すにはどうすればよいですか?

4

3 に答える 3

1
// make your UITextView as a subclass of UITextView
// and override -drawRect: method in your UITextView subclass 
- (void)drawRect:(CGRect)rect
{
    self.textColor = [UIColor clearColor];

    [self setTypingAttributes:[NSDictionary dictionaryWithObjectsAndKeys:self.font, NSFontAttributeName, _textBaseColor, NSForegroundColorAttributeName, nil ]]; // _textBaseColor is any color of your choice
    CGRect newRect = CGRectMake(0, 0, CGRectGetWidth(self.frame), CGRectGetHeight(self.frame));
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetTextDrawingMode(context, kCGTextStroke);
    // Make the thickness of the outline shadow. and increase the y position of shadow rect by 2.
    CGContextSetLineWidth(context, (TEXTOUTLINE_PERCENT/100 * self.font.pointSize)+1); // TEXTOUTLINE_PERCENT can be 25.
    CGContextSetLineJoin(context, kCGLineJoinRound);
    CGContextSetLineCap(context, kCGLineCapButt);
    CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);
    CGRect shadowrect = newRect;
    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone)
    {
        shadowrect.origin.y += 0.5;
    }
    else
    {
        shadowrect.origin.y += 2;
    }

    [self.text drawInRect:shadowrect withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:self.font, NSFontAttributeName, SHADOW_COLOR , NSForegroundColorAttributeName, nil]]; // SHADOW_COLOR can be [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.3]

    // Make the thickness of the outline border of the text.
    CGContextSetLineWidth(context, TEXTOUTLINE_PERCENT/100 * self.font.pointSize); // TEXTOUTLINE_PERCENT can be 25.
    CGContextSetStrokeColorWithColor(context, [[UIColor clearColor] CGColor]);
    [self.text drawInRect:newRect withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:self.font, NSFontAttributeName, self.textOutlineColor , NSForegroundColorAttributeName,  nil]];

    // Draw filled text. This is the actual text.
    CGContextSetTextDrawingMode(context, kCGTextFill);
    CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
    [self.text drawInRect:newRect withAttributes:[NSDictionary dictionaryWithObjectsAndKeys:self.font, NSFontAttributeName, _textBaseColor, NSForegroundColorAttributeName,_textBaseColor, NSStrokeColorAttributeName, nil]];
    [super drawRect:rect];
}
于 2015-04-06T05:57:05.593 に答える
0

編集可能なテキストフィールド(TextArea)に赤く光るテキストを含むHTMLファイルを作成します。

すべての要素の背景を透明に設定します。

文字列にして、テキストを配置する画像の上にある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
于 2013-01-10T18:12:54.037 に答える
0

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 グロー内のテキストが Web ページ上で読み上げられます。(必要に応じて、背景を黒にすることもできます...これを使用します:

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 にロードします。または、javascript を介して URL に挿入し、その URL を UIWebView にロードします。

UIWebView のフレームと場所を UITextView のフレームと場所に合わせて設定し、その上に配置され、黒い背景に赤く光るテキストが表示されるようにします。

于 2013-01-10T04:12:02.660 に答える