web-dev-qa-db-ja.com

UITextFieldテキストに影を落とす

UITextFieldのテキストに影を追加することは可能ですか?

54
DotSlashSlash

3.2では、CALayerシャドウプロパティを使用できます。

_textField.layer.shadowOpacity = 1.0;   
_textField.layer.shadowRadius = 0.0;
_textField.layer.shadowColor = [UIColor blackColor].CGColor;
_textField.layer.shadowOffset = CGSizeMake(0.0, -1.0);
176
egarc

私はわずかに異なる問題を抱えています-UILabelにぼやけた影が欲しいです。幸いなことに、これに対する解決策はタイラーからの番号(2)であることが判明しました。

ここに私のコードがあります:

- (void) drawTextInRect:(CGRect)rect {
    CGSize myShadowOffset = CGSizeMake(4, -4);
    CGFloat myColorValues[] = {0, 0, 0, .8};

    CGContextRef myContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(myContext);

    CGColorSpaceRef myColorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef myColor = CGColorCreate(myColorSpace, myColorValues);
    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor);

    [super drawTextInRect:rect];

    CGColorRelease(myColor);
    CGColorSpaceRelease(myColorSpace); 

    CGContextRestoreGState(myContext);
}

これは、UILabelから拡張され、下から右4pxに影を付けてテキストを描画するクラス内にあり、影は80%の不透明度で灰色で、見た目がぼやけています。

タイラーのソリューション番号2は、タイラーの番号1よりもパフォーマンスが少し優れていると思います-ビューで1つのUILabelのみを処理しており、すべてのフレームを再描画していないと仮定すると、レンダリングパフォーマンスのヒットはありません通常のUILabel。

PSこのコードは、 Quartz 2Dドキュメンテーション

72
deanWombourne

ここでは、UILabelを使用してテキストシャドウの組み込みサポートを取得するとは思わない。

2つのアイデア:

(1)[ややコーディングが難しい。]2番目のUITextFieldを非常に小さなオフセットで追加します(たぶん(0.2,0.8)?) 。 UITextFieldDelegate プロトコルでtextField:shouldChangeCharactersInRange:replacementString:メソッドを実装することにより、キーごとにすべてのテキスト変更を聞くことができます。それを使用して、下のテキストを同時に更新できます。また、下部のテキスト(影のテキスト)を灰色にし、わずかにオフセットしたテキストの長方形がぼやけて見えるという事実を使用して、わずかにぼやけさせることもできます。 追加:ああ、そうだ、もしこのアイデアを使うなら、トップテキストフィールドの背景色を[UIColor clearColor]に設定することを忘れないでください。

(2)[さらに楽しいコード。]UITextFieldをサブクラス化し、drawRect:メソッドをオーバーライドします。私はこれをやったことがないので、これが指定された描画方法であることに依存することを前もって述べます。そして、 drawTextInRect: 、これはUITextFieldに固有です。 CGContextSetShadow関数 で影を描くように描画コンテキストを設定し、[super drawRect:rect];を呼び出します。うまくいけば、元のUITextFieldコードが描画コンテキストのシャドウパラメータをクリアする場合、そのアイデアはうまくいきません。すべての描画コードを自分で書く必要があります。コピーアンドペーストや日本語の漢字入力など、UITextFieldsに付属する追加機能。

19
Tyler

影をUITextViewに直接適用する方法は機能しますが、これは間違った方法です。明確な背景色で影を直接追加することにより、すべてのサブビューはカーソルも含めて影を取得します。

使用すべきアプローチは、NSAttributedStringを使用することです。

NSMutableAttributedString* attString = [[NSMutableAttributedString alloc] initWithString:textView.text];
NSRange range = NSMakeRange(0, [attString length]);

[attString addAttribute:NSFontAttributeName value:textView.font range:range];
[attString addAttribute:NSForegroundColorAttributeName value:textView.textColor range:range];

NSShadow* shadow = [[NSShadow alloc] init];
shadow.shadowColor = [UIColor whiteColor];
shadow.shadowOffset = CGSizeMake(0.0f, 1.0f);
[attString addAttribute:NSShadowAttributeName value:shadow range:range];

textView.attributedText = attString;

ただし、textView.attributedTextはiOS6用です。下位バージョンをサポートする必要がある場合は、次のアプローチを使用できます。 (#import <QuartzCore/QuartzCore.h>の追加を忘れないでください)

CALayer *textLayer = (CALayer *)[textView.layer.sublayers objectAtIndex:0];
textLayer.shadowColor = [UIColor whiteColor].CGColor;
textLayer.shadowOffset = CGSizeMake(0.0f, 1.0f);
textLayer.shadowOpacity = 1.0f;
textLayer.shadowRadius = 0.0f;
16
cnotethegr8