UIView があり、その下部を不透明度 0 にフェードアウトさせたいと考えています。
UIView 全体とそのコンテンツに影響を与えるために、これを UIView (CALayer) に対して行うことはできますか?
はい、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.framework
PSまた、物事を機能させるためにアプリにリンクする必要があります.
ウラジミールの答えは正しいですが、問題はビューの変更後にグラデーションレイヤーを同期することです。たとえば、電話を回転させたり、ビューのサイズを変更したりする場合です。そのため、レイヤーの代わりに画像を使用できます。
@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
そのように、他の形状の画像をマスクとして使用できます。