59

iPhone では、そのままでは UILabel がソフト シャドウをサポートしていないことを私は知っています。では、自分のものを実装する最良の方法は何でしょうか?

編集:

明らかに、-drawRect をサブクラス化UILabelし、-drawRect で描画します。私の質問は、ラベルの内容をグラフィックとして取得し、それらの周りに描画したり、ぼかしたりする方法です...

編集2:

約1年後、私はこの質問に戻りました。それまでの間、ラベルにソフト シャドウを簡単に追加したり、半径などを微調整したり、テキスト自体にグラデーションを描画したりできるクラスを作成しました。GitHub で見つけることができます: https://github.com/doukasd/iOS-Components/tree/master/Views

4

15 に答える 15

191

3.2 の時点で、SDK でシャドウが直接サポートされています。

label.layer.shadowColor = [label.textColor CGColor];
label.layer.shadowOffset = CGSizeMake(0.0, 0.0);

#import <QuartzCore/QuartzCore.h>いくつかのパラメータで遊んでください:

label.layer.shadowRadius = 3.0;
label.layer.shadowOpacity = 0.5;

そして、ラベルの境界によって影がクリップされている場合:

label.layer.masksToBounds = NO;

最終的に設定

label.layer.shouldRasterize = YES;
于 2011-01-20T14:29:42.140 に答える
38

UILabel の shadowColor および shadowOffset プロパティを使用することをお勧めします。

UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);
于 2010-03-02T13:15:01.957 に答える
19

この同様の質問に対するこの回答は、UILabel の背後にぼやけた影を描画するためのコードを提供します。作成者は CGContextSetShadow() を使用して、描画されたテキストの影を生成します。

于 2009-11-10T18:19:39.043 に答える
17

IIDanの答えに加えて:いくつかの目的のために設定する必要があります

label.layer.shouldRasterize = YES

これは、シャドウのレンダリングに使用されるブレンドモードによるものだと思います。たとえば、背景が暗く、テキストが白で、黒い影のような輝きを使用してテキストを「ハイライト」したいとしました。このプロパティを設定するまで機能しませんでした。

于 2013-03-20T16:31:00.633 に答える
7

次のように、ビューのレイヤーに (ソフト) シャドウを適用します。

UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;
于 2010-05-19T09:45:06.840 に答える
7

最新の状態に保つには: Swift でシャドウを作成するのは、次のように簡単です。

QuartzCore フレームワークをインポートする

import QuartzCore

シャドウ属性をラベルに設定します

titleLabel.shadowColor = UIColor.blackColor()
titleLabel.shadowOffset = CGSizeMake(0.0, 0.0)
titleLabel.layer.shadowRadius = 5.0
titleLabel.layer.shadowOpacity = 0.8
titleLabel.layer.masksToBounds = false
titleLabel.layer.shouldRasterize = true
于 2015-08-19T11:14:37.437 に答える
5
_nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
_nameLabel.font = [UIFont boldSystemFontOfSize:19.0f];
_nameLabel.textColor = [UIColor whiteColor];
_nameLabel.backgroundColor = [UIColor clearColor];
_nameLabel.shadowColor = [UIColor colorWithWhite:0 alpha:0.2];
_nameLabel.shadowOffset = CGSizeMake(0, 1);

[UIColor colorWithWhite:0 alpha:0.2] を使用してアルファ値を設定する必要があると思います。

于 2013-07-22T03:17:04.370 に答える
4

これらの手法のほとんどすべて (FXLabel を除く) を試しましたが、iOS 7 で動作するものはありませんでした。最終的に、私にとって完全に機能する THLabel を見つけました。Interface Builder で THLabel を使用し、ユーザー定義のランタイム属性をセットアップして、プログラマーでなくてもルック アンド フィールを簡単に制御できるようにしました。

https://github.com/MuscleRumble/THLabel

于 2013-11-22T16:03:01.853 に答える
3

UILabel サブクラスにソフト シャドウのサポートとその他の効果を多数提供するライブラリを作成しました。

https://github.com/nicklockwood/FXLabel

于 2012-06-07T09:20:39.903 に答える
3

前述のように、UILabel をサブクラス化し、drawRect:[self drawTextInRect:rect];で現在のコンテキストに描画されたテキストを取得します。そこに入ったら、フィルターなどを追加して作業を開始できます。コンテキストに描画したばかりのものでドロップ シャドウを作成する場合は、次を使用できるはずです。

CGContextSetShadowWithColor()

ドキュメントでその関数を調べて、その使用方法を学びます。

于 2009-11-10T18:20:04.347 に答える
1

iOS 5 の時点で、Apple はソフト シャドウでラベルを作成するためのプライベート API メソッドを提供しています。ラベルは非常に高速です。一連の透明なビューで同時に数十を使用していますが、アニメーションのスクロールに速度低下はありません。

これは、(明らかに) App Store 以外のアプリでのみ有用であり、ヘッダー ファイルが必要です。

$SBBulletinBlurredShadowLabel = NSClassFromString("SBBulletinBlurredShadowLabel");

CGRect frame = CGRectZero;

SBBulletinBlurredShadowLabel *label = [[[$SBBulletinBlurredShadowLabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.font = [UIFont boldSystemFontOfSize:12];
label.text = @"I am a label with a soft shadow!";
[label sizeToFit];
于 2011-10-05T22:43:57.847 に答える
-3

UILabel をサブクラス化し、-drawInRect をオーバーライドします。

于 2009-11-10T16:15:54.497 に答える