質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

2回答

5164閲覧

CAGradientLayerでグラデーションを実装する際のCALayerの扱いについて

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

1クリップ

投稿2016/12/31 16:45

編集2017/01/01 08:35

CAGradientLayerメソッドを使ってグラデーションを実装しようとこころみましたが、
レイヤーより下の階層のパーツに対してもグラデーションの影響が出てしまいました。
イメージ説明
白いテキストにグラデーションとして設定した緑がうっすらかかっています。

#実施した方法
イメージ説明
基本構造はViewControllerの中にtableViewを配置、
Dynamic Prototypesを使ってCellを生成しています。

この時self.viewにはベースとなるカラー(透過なし)を設定し。
その下の階層にあるtableViewにグラーデーションレイヤーを適用しています。
イメージ説明

グラーデーションの設定値はこちら

startColor = UIColor(red: 30/255, green: 255/255, blue: 0/255, alpha: 0.15).cgColor endColor = UIColor(red: 0/255, green: 0/255, blue: 0/255, alpha: 0.25).cgColor

階層
イメージ説明
薄い水色---Layer
グリーン ---TableView

最初はtableViewCellのViewパーツより手前側にレイヤーが配置されているからTableViewCellがレイヤーの影響を受けていると考えていたので
tableViewCellでなければコードでパーツを作成してレイヤーをaddした後に
さらにその上にラベルをaddしようと考えていたのですが、
階層をみると階層は関係ないようです。

ここまで調べた所で解決先が思いつかなくなりご相談させていただきました。

どうかよろしくお願いします。


#おかげさまで解決しました!!!
解決したのですが、その挙動に疑問が残るので共有しておきます。

1)self.viewに対し、階層の0番目にレイヤーを追加
self.view.layer.insertSublayer(layer, at: 0)
イメージ説明

結果
イメージ説明
tableViewより後ろにレイヤーが存在するため、
tableViewに設定した色のみが前面に表示

2)self.viewに対し、階層の1番目にレイヤーを追加
上記とまったく同じ結果

3)self.viewに対し、階層の2番目にレイヤーを追加
イメージ説明
レイヤーの階層における位置は同じ場所にあるように見えるが
結果
イメージ説明
tableViewよりも手前にレイヤーがあるようす。

4)tableViewに対し、階層の0番目にレイヤーを追加
イメージ説明
先ほどまで存在した黄緑色のviewがなくなりtableView自体の色が変わっている。

結果
イメージ説明
ラベルに影響なく、tableViewにのみグラデーションをかけた状態に。

今回わかったこと
・そもそもXcodeのview hierarchyで見られるviewにレイヤーはうつっていない。

・viewを選択するとCALayerクラスのviewが存在するが、
この時レイヤーはこのUIViewに対して配置されている。

イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

_Kentarou

2017/01/01 03:12

最終的に作りたいものがわからないので質問です、テーブル自体にグラデーションがかかっているものか、テーブルセルごとにグラデーションがかかっているものかどちらでしょうか?
退会済みユーザー

退会済みユーザー

2017/01/01 08:07

テーブル自体にグラデーションをかけたいです!
guest

回答2

0

ベストアンサー

追記します。insertSublayerでView階層も調節できます。この場合は、一番下に配置されます。
self.view.layer.insertSublayer(gradientLayer, atIndex: 0)

投稿2016/12/31 19:26

Dbank

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2017/01/01 08:17

おけましておめでとうございます^^ おかげさまで上記を使って解決できました! tableViewに対してレイヤーをat:0にインサートすると想定通りの結果ができました! これについてちょっと書きます
guest

0

明けましておめでとうございます。CAGradientLayerは他のパーツにも影響が、かかってしまうようです。
提示していただいたViewの階層を見ると、全体にLayerのViewがあるので、Layerのframeを調整すれば良いのでは?と思いました。実施したいことは、他のパーツに影響なくframe管理することと思いましたので,そのようなアプリを即席で作ってみました。参考にどうぞ。
gradientLayer = CAGradientLayer()
gradientLayer.frame = CGRect(x:50,y:UIScreen.main.bounds.height/2,width:UIScreen.main.bounds.width/1.5,height:UIScreen.main.bounds.height/4)
self.view.layer.addSublayer(gradientLayer)
イメージ説明説明説明](8331e410a1ec2e2880a07926000ca81d.png)](5fed796446e7a77c7573c0db9171932a.png)

投稿2016/12/31 18:50

Dbank

総合スコア120

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問