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

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

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

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

Q&A

解決済

2回答

6823閲覧

[Swift4] コードで設定したグラデーションレイヤーを取り除きたい

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/03/13 06:33

編集2018/03/13 08:35

いつもお世話になります。

StroyBoardで設置したUIButtonに、コード上でグラデーションレイヤーを設定し、
設定したレイヤーをとりのぞいてボタンを初期状態に戻したいのですが、どのようにすればよいでしょうか?

swift

1 2↓これでグラデーションを追加 3 4// ボタン背景にグラデーションを変更する関数 5 func changeSelectedButtonBackground (Button: UIButton) { 6 // 選択されたボタンのグラデーション色を設定する 7 let topColor = UIColor.hex(hexStr: "AAAAAA", alpha: 1.0) 8 let bottomColor = UIColor.hex(hexStr: "686868", alpha: 1.0) 9 //グラデーションの色を配列で管理 10 let gradientColors: [CGColor] = [topColor.cgColor, bottomColor.cgColor] 11 //グラデーションレイヤーを作成 12 let gradientLayer: CAGradientLayer = CAGradientLayer() 13 //グラデーションの色をレイヤーに割り当てる 14 gradientLayer.colors = gradientColors 15 //グラデーションレイヤーを対象ボタンのサイズにする 16 gradientLayer.frame = Button.bounds 17 //グラデーションレイヤーを配置 index(0)に追加しているので、index指定で削除できたら今後自由度高くなるから嬉しい 18 Button.layer.insertSublayer(gradientLayer, at: 0) 19 } 20 21 22↓この関数で特定ボタンのグラデーションを解除したいが、StoryBoardでも背景にグラデーションを掛けてるのでそれもきえてるのかな? 23 24 25 // ボタン背景のグラデーションを取り除く関数 26 func removeGradientFromButtonBackground (Button: UIButton) { 27 Button.layer.sublayers = nil 28 } 29

↓下記を実行した際のプリントログ

swift

1 2// ボタン背景のグラデーションを取り除く関数 3 func changeDefaultButtonBackground (Button: UIButton) { 4 //Button.layer.sublayers?.remove(at: 0) 5 if let layer = Button.layer.sublayers?.first { 6 print("Button.layer.sublayers:",Button.layer.sublayers) 7 layer.removeFromSuperlayer() 8 } 9 }

Button.layer.sublayers:

Optional([<CAGradientLayer:0x168666f0; position = CGPoint (31.75 13.5);
bounds = CGRect (0 0; 63.5 27); allowsGroupOpacity = YES; zPosition = -100;
cornerRadius = 1; colors = (
"<CGColor 0x155c9e90> [<CGColorSpace 0x1565cdb0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 0.121569 0.129412 0.141176 1 )",
"<CGColor 0x15591600> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 0.407819 1 )")>,

<CAGradientLayer:0x156755f0; position = CGPoint (31.75 13.25); bounds = CGRect (0 0; 63.5 26.5); allowsGroupOpacity = YES; colors = (
"<CGColor 0x156f9400> [<CGColorSpace 0x1565cdb0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 0.666667 0.666667 0.666667 1 )",
"<CGColor 0x15665b00> [<CGColorSpace 0x1565cdb0> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1; extended range)] ( 0.407843 0.407843 0.407843 1 )")>,

<CALayer:0x1683fd20; position = CGPoint (0 0); bounds = CGRect (0 0; 0 0); delegate = <UIImageView: 0x155294f0; frame = (0 0; 0 0);
clipsToBounds = YES; alpha = 0.2; hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x1683fd20>>; hidden = YES; masksToBounds = YES; allowsGroupOpacity = YES; opacity = 0.2>,

<_UILabelLayer:0x155aa940; position = CGPoint (31.75 13.75); bounds = CGRect (0 0; 51.5 11.5); delegate = <UIButtonLabel: 0x155a0ee0; frame = (6 8; 51.5 11.5); text = 'CLIPLINES'; alpha = 0.2; opaque = NO;
userInteractionEnabled = NO;

layer = <_UILabelLayer: 0x155aa940>>; contents = <CABackingStore 0x15789090 (buffer [123 23] BGRA8888)>; allowsGroupOpacity = YES; opacity = 0.2; contentsMultiplyColor = (null); rasterizationScale = 2; contentsScale = 2>,

<CALayer:0x1683d990; position = CGPoint (59.5 22.5);bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x155295f0; frame = (58.5 21.5; 2 2); layer = <CALayer: 0x1683d990>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x16840460; position = CGPoint (59.5 22.5); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x155296d0; frame = (58.5 21.5; 2 2);
layer = <CALayer: 0x16840460>>;
allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x1552d0b0; position = CGPoint (59.5 22.5); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x1552cfd0; frame = (58.5 21.5; 2 2); layer = <CALayer: 0x1552d0b0>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x1561e380; position = CGPoint (59.5 22.5); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x15651c50; frame = (58.5 21.5; 2 2); layer = <CALayer: 0x1561e380>>;
allowsGroupOpacity = YES; backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x156662e0; position = CGPoint (59.5 22.5);bounds = CGRect (0 0; 2 2);delegate = <UIView: 0x15666200;frame = (58.5 21.5; 2 2);
layer = <CALayer: 0x156662e0>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x157da490; position = CGPoint (59.5 23); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x157da3b0; frame = (58.5 22; 2 2);
layer = <CALayer: 0x157da490>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x157daa10; position = CGPoint (59.5 23); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x157da930; frame = (58.5 22; 2 2);
layer = <CALayer: 0x157daa10>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x1564b150; position = CGPoint (59.5 23); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x1565fc20; frame = (58.5 22; 2 2);
layer = <CALayer: 0x1564b150>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x16868830; position = CGPoint (59.5 23); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x15531c30; frame = (58.5 22; 2 2);
layer = <CALayer: 0x16868830>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>,

<CALayer:0x15547290; position = CGPoint (59.5 23); bounds = CGRect (0 0; 2 2); delegate = <UIView: 0x155471b0; frame = (58.5 22; 2 2);
layer = <CALayer: 0x15547290>>; allowsGroupOpacity = YES;
backgroundColor = <CGColor 0x156af0f0> [<CGColorSpace 0x15560350> (kCGColorSpaceICCBased; kCGColorSpaceModelMonochrome; Generic Gray Gamma 2.2 Profile; extended range)] ( 1 1 )>])

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

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

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

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

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

guest

回答2

0

swift

1XXXButton.layer.insertSublayer(gradientLayer, at: 0)

これは、XXXButton.layerにSublayerを追加。

swift

1XXXButton.layer.removeFromSuperlayer()

これは、XXXButton.layerをSuperlayerから取り除く。


やりたいことは「XXXButton.layerのSublayer」をSuperlayer(== XXXButton.layer)から取り除く。

swift

1if let layer = button.layer.sublayers?.first { //button.layerの最初のSublayerを 2 layer.removeFromSuperlayer() //Superlayerから取り除く 3}

他にSublayerを追加していないのであれば、

swift

1button.layer.sublayers = nil

でいいような気も。

※動作未確認

投稿2018/03/13 07:05

編集2018/03/13 07:07
fuzzball

総合スコア16731

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

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

退会済みユーザー

退会済みユーザー

2018/03/13 07:49

回答ありがとうございます。 storyBoard上で背景をグラデーションで塗っているので、ご指摘の「他にSublayerを追加していないのであれば、」に該当して動かないようです。 頂いたアドバイスをちょっといじって解決したいと思います。
fuzzball

2018/03/13 07:54

それはnilを代入するときの話で、上側の書き方であれば問題ないと思うのですが。 removeの直前に、 print(button.layer.sublayers) を追加して、Sublayerを確認してみて下さい。
退会済みユーザー

退会済みユーザー

2018/03/13 07:59

上側の書き方を試していたのですが、if let文のなかを通ったのでremoveFromSuperlayer()を 実行したと思うのですが、自分の環境では対象レイヤーはfirstで捕まえられなかったようです。 print(button.layer.sublayers)で確認してみます。
fuzzball

2018/03/13 08:11

そのボタンはカスタムクラスを使っているのでしょうか?
退会済みユーザー

退会済みユーザー

2018/03/13 08:45 編集

はい、カスタムクラスを作って、storyBoard上で割り当てています。 カスタムクラス内でCAGradientLayerをつかっていることをすっかり忘れていました。 print(button.layer.sublayers)ためしたところ、多量のレイヤーがあるようなかんじです。 結果は、質問の一番下に貼ってみます。お時間がありましたら見てください。 一歩後退してシンプルなテストプロジェクトをつくって試してみようと思います。
fuzzball

2018/03/13 22:32 編集

2番目のやつですね。 button.layer.sublayers?.first の代わりに button.layer.sublayers?[1] で、とりあえずいけると 思いますが、さすがにそれはダメなので、作ったCAGradientLayerを保存しておいて、そのSublayerを取り除くような処理にするのがいいと思います。(追記:miyabi_takatsukさんの回答を参照)
退会済みユーザー

退会済みユーザー

2018/03/13 09:06 編集

button.layer.sublayers?[1] で消えました。 いろいろ本当にありがとうございます。 firstで捕まえられないことといい、CALayerとサブクラスとなるCAGradientLayerで何か違いがあるのでしょうか?などなどじっくり調べて、頂いだ助言も合わせて解決してみたいと思います。
fuzzball

2018/03/13 09:18

changeSelectedButtonBackgroundでCAGradientLayerを追加した後、他のどこかで(おそらくカスタムクラスの中で)Sublayerを追加しているからでしょう。
退会済みユーザー

退会済みユーザー

2018/03/13 09:39

button.layer.sublayers?.firstは一番上のCAGradientLayerを取得 button.layer.sublayers?.lastは一番下のCALayerを取得 button.layer.sublayers?[1]はCALayerの中で一番上を取得? sublayersリスト 上 1:CAGradientLayer ←firstで取得   2:CAGradientLayer 3:CALayer : alpha = 0.2   ←[1]で取得  (1:のCAGradientLayer の親?) 4:CALayer(UILabel?): alpha = 0.2      (2:のCAGradientLayer の親?) . . . . CALayer(UILabel?): alpha = 0.2 ←lastで取得 下 CAGradientLayer は単体で削除できなくて、親を削除する?と消える?ってことですか? 「CAGradientLayer を除いたfirst」で親?が取得できるかな?
fuzzball

2018/03/13 10:11 編集

[1]は2番目です。 first = [0] = 1番目です。 CAGradientLayerとかCALayerとかは関係ありません。
退会済みユーザー

退会済みユーザー

2018/03/13 10:48

すいません、インデックスですよね。勘違いしました。
guest

0

ベストアンサー

多分、ボタン自体の親からみて、ボタン自体のレイヤーを削除!ってなっちゃってるんだと思います。
gradientLayerを外で定義して、
削除するのはいかがでしょうか。
動作確認していないので、動かなかったら申し訳ないです・・・。

swift

1import UIKit 2 3class ViewController: UIViewController { 4 let gradientLayer: CALayer? 5 let XXXButton: UIButton = UIButton() 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 9 // 各変数の設定は省略します。 10 // gradientLayer = CALayer()とかで定義する 11 self.XXXButton.layer.insertSublayer(gradientLayer!, at: 0) 12 13 // 様々処理 14 15 self.gradientLayer!.removeFromSuperlayer() 16 } 17 18} 19

投稿2018/03/13 06:48

miyabi_takatsuk

総合スコア9528

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

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

退会済みユーザー

退会済みユーザー

2018/03/13 11:24

「コメントする」ボタンを押し忘れてコメントが消えてしまっていたようです。 最初に回答していただいてありがとうございました。 外で定義して削除を試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問