4

スクロール可能なテキストを含む UITextView があります。グラデーションレイヤーを適用しようとしているので、表示されているテキストの下部は常にわずかにフェードアウトしています。

これが私のコードです:

CAGradientLayer *maskLayer = [CAGradientLayer layer];

maskLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor clearColor] CGColor], (id)[[UIColor yellowColor] CGColor], nil];
maskLayer.locations = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.0],
                       [NSNumber numberWithFloat:0.2],
                       [NSNumber numberWithFloat:0.8],
                       [NSNumber numberWithFloat:1.0], nil];
maskLayer.bounds = clueTextView.bounds;
myUITextView.layer.mask = maskLayer;

現在、これにより UITextViewLayer が完全に透明になります。UITextViewLayer がサブビューである UIView の背景色が表示されます。テキストを選択してコピーし、メモ プログラムに貼り付けることはできますが、その中に含まれているテキストをまったく見ることができません。

私が見逃しているアイデアはありますか?

4

1 に答える 1

12

いくつかの問題があります。

グラデーション レイヤーのcolorsプロパティは、そのプロパティと同じカウントを持つ必要がありlocationsます。あなたは4つの場所を提供していますが、2色しかありません.

に基づいてグラデーション レイヤーの境界をclueTextView設定していますが、それを のマスクとして設定していますmyUITextView

boundsグラデーション レイヤーの を設定していますが、その は設定していませんposition。デフォルトpositionは 0,0 で、グラデーション レイヤーの中心が の左上隅にあることを意味しmyUITextViewます。frameグラデーション レイヤーの をboundsテキスト ビューの に設定するだけのほうが簡単です。

これらの問題をすべて修正すると、探している効果が得られる可能性があります。

- (void)initTextViewMask {
    CAGradientLayer *maskLayer = [CAGradientLayer layer];
    maskLayer.colors = @[
        (id)[UIColor whiteColor].CGColor,
        (id)[UIColor whiteColor].CGColor,
        (id)[UIColor clearColor].CGColor];
    maskLayer.locations = @[ @0.0f, @0.8f, @1.0f ];
    maskLayer.frame = textView_.bounds;
    textView_.layer.mask = maskLayer;
}

ただし、新しい問題が発見される場合があります。

ユーザーがテキスト ビューをスクロールできる場合、グラデーションがテキスト ビューと共に移動することがわかりますが、これはおそらく意図したものではありません。これを修正する最も簡単な方法は、コンテナ内にテキスト ビューを埋め込み、UIViewコンテナ ビューにマスクを設定することです。

テキスト ビューのサイズが変更される可能性がある場合 (デバイスの回転が原因である可能性があります)、マスクは自動的にサイズを変更しません。またはframeでマスクの を更新する必要があります。layoutSubviewsviewDidLayoutSubviews

于 2012-10-11T18:39:49.230 に答える