web-dev-qa-db-ja.com

iPhone UILabelテキストのソフトシャドウ

IPhoneのUILabelでは、ソフトシャドウはサポートされていません。それでは、自分のものを実装する最良の方法は何でしょうか?

編集:

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

編集2:

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

59
Dimitris

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

19
Brad Larson

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

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

インポート<QuartzCore/QuartzCore.h>そして、いくつかのパラメータで遊ぶ:

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

また、ラベルの境界でクリップされた影が見つかった場合:

label.layer.masksToBounds = NO;

最終的に設定

label.layer.shouldRasterize = YES
189
IlDan

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

UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);
38
oksk

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

label.layer.shouldRasterize = YES

これは、シャドウのレンダリングに使用されるブレンドモードによるものだと思います。たとえば、暗い背景と白いテキストがあり、黒い影のようなグローを使用してテキストを「強調」したかった。このプロパティを設定するまで動作しませんでした。

17
Stefan

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

UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;
7
Yang Meyer

物事を最新に保つには: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
6
Sebastian Hojas
_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]を使用してアルファ値を設定する必要があると思います。

5
bigjava

私はこれらのテクニックのほとんどすべて(FXLabelを除く)を試してみましたが、iOS 7で動作させることができませんでした。 Interface BuilderでTHLabelを使用し、ユーザー定義のランタイム属性を設定して、非プログラマーがルックアンドフィールを簡単に制御できるようにしました。

https://github.com/MuscleRumble/THLabel

4
Sean

これはトリックのような、

UILabel *customLabel = [[UILabel alloc] init];

UIColor *color = [UIColor blueColor];
customLabel.layer.shadowColor = [color CGColor];
customLabel.layer.shadowRadius = 5.0f;
customLabel.layer.shadowOpacity = 1;
customLabel.layer.shadowOffset = CGSizeZero;
customLabel.layer.masksToBounds = NO;
4
Nagarjun

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

CGContextSetShadowWithColor()

使用方法については、ドキュメントでその機能をご覧ください。

3
Tyler

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

https://github.com/nicklockwood/FXLabel

3
Nick Lockwood

Swift 3、拡張機能を作成できます。

import UIKit

extension UILabel {
    func shadow() {
        self.layer.shadowColor = self.textColor.cgColor
        self.layer.shadowOffset = CGSize.zero
        self.layer.shadowRadius = 3.0
        self.layer.shadowOpacity = 0.5
        self.layer.masksToBounds = false
        self.layer.shouldRasterize = true
    }
}

それを経由して使用します:

label.shadow()
1
Brian

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];
1
Sticktron