15

UIView があり、その下部を不透明度 0 にフェードアウトさせたいと考えています。

UIView 全体とそのコンテンツに影響を与えるために、これを UIView (CALayer) に対して行うことはできますか?

4

2 に答える 2

34

はい、CAGradientLayerビューのレイヤーマスクとして設定することでそれを行うことができます:

#import <QuartzCore/QuartzCore.h>

...

CAGradientLayer *maskLayer = [CAGradientLayer layer];

maskLayer.frame = view.bounds;
maskLayer.colors = @[(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor];
maskLayer.startPoint = CGPointMake(0.5, 0);
maskLayer.endPoint = CGPointMake(0.5, 1.0);

view.layer.mask = maskLayer;

QuartzCore.frameworkPSまた、物事を機能させるためにアプリにリンクする必要があります.

于 2011-09-21T21:50:49.883 に答える
0

イメージをマスクとして使用して、レイアウトの問題を防ぎます。

ウラジミールの答えは正しいですが、問題はビューの変更後にグラデーションレイヤーを同期することです。たとえば、電話を回転させたり、ビューのサイズを変更したりする場合です。そのため、レイヤーの代わりに画像を使用できます。

@IBDesignable
class MaskableLabel: UILabel {
    var maskImageView = UIImageView()

    @IBInspectable
    var maskImage: UIImage? {
        didSet {
            maskImageView.image = maskImage
            updateView()
        }
    }

    override func layoutSubviews() {
        super.layoutSubviews()
        updateView()
    }

    func updateView() {
        if maskImageView.image != nil {
            maskImageView.frame = bounds
            mask = maskImageView
        }
    }
}

次に、このような単純なグラデーション マスクを使用すると、ストーリーボードでもすぐに確認できます。

プレビュー

ノート:

これを使用して、サブクラス化したい他のビューにclass置き換えることができます。UILabel

骨格:

そのように、他の形状の画像をマスクとして使用できます。

于 2020-07-31T19:27:57.747 に答える