11

UIViewController背景グラデーションを作成する場所があり ます

    CAGradientLayer *gradient = [CAGradientLayer layer];
    ...
    gradient.frame = frame;
    self.backGradient = gradient;
    [self.view.layer insertSublayer:gradient atIndex:0];

_selectionFrameそれは正常に動作しますが、後でView Controllerのサブビューを背面に送信する必要があります:(アニメーションと描画の目的で、背面と前面に
送信する必要があることがよくあります)_selectionFrame

selfビューコントローラーです:

[self.view sendSubviewToBack:_selectionFrame]; 

ただし、これは の_selectionFrame後ろに送信しますgradient。グラデーションのすぐ上で、他のすべてのサブビューの下に配置したい。問題は、グラデーションがビューではないため、グラデーションに関数を使用できないことです。
電話したい[self.view sendSubviewToBack:gradient];

しかし、これはうまくいきません。

4

3 に答える 3

15

グラデーションのみを含むビューを作成する

于 2013-06-22T00:55:36.173 に答える
4

最も簡単な解決策は、グラデーション レイヤーを のサブレイヤーとして挿入しないことですself.view.layer。代わりに、する必要があります self.view.layer。UIView サブクラスには、layerClassそのレイヤーがどのクラスであるべきかを指定できるクラス メソッドがあります。

たとえば、UIViewサブクラスに次のように追加します。

override class var layerClass: AnyClass {
    return CAGradientLayer.self
}

ビュー内で参照self.layerする場合は、ガードレットでラップするか、次のように型を変換する場合は let を使用します。

guard let layer = self.layer as? CAGradientLayer else { ... }

または、の他のサブビューのレイヤーである可能性もありself.view、これも同じクラス メソッドを使用して簡単に配置できlayerClassます。

それ以外の場合は、ビュー コマンドではなく、レイヤー コマンドを使用して、 のサブレイヤーを並べ替える必要がありself.viewます。これには、そのサブビューが含まれます。つまり、vが のサブビューである場合self.viewv.layerは のサブレイヤーでself.view.layerあり、サブレイヤー配列を並べ替えることで、サブレイヤー間で順序付けできます。

于 2013-06-22T00:53:57.057 に答える