13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SwiftUIで背景いっぱいにグラデーションで描画してみた

Last updated at Posted at 2019-09-18

環境

  • Xcode(11.0 Beta)
  • macOSCatalina(10.15 Beta)

背景を設定する

⌘+クリックからのインスペクターから、backGround設定できるやん。
と気づいて生成された結果がこちら

struct ContentView: View {
    var body: some View {
        VStack {
            Text("Hello World")
        }
        .background(Color.blue)
    }
}

思ってたのとぜんぜん違うじゃん!どうなってんの!
shot1.png

ちょっと調べてみた

+ボタンからパーツを選択するときにZStackとか言うものがあるみたい
(チュートリアルはまだ途中までしかやってないので知らず...)
公式にこんな事が書いてました。
「ZStack A view that overlays its children, aligning them in both axes.」
ようは重ねる事ができるってことですね。
画像の上にテキスト表示するときとかで使えそうですね。

Zstackでやってみた結果がこちら

struct ContentView: View {
    var body: some View {
        ZStack {
            Color.red
            Text("Hello World")
        }
    }
}

おっいい感じ
スクリーンショット 2019-09-18 21.52.57.png

外枠の部分も表示しよう

struct ContentView: View {
    var body: some View {
        ZStack {
            Color.red.edgesIgnoringSafeArea(.all)
            Text("Hello World")
        }
    }
}
スクリーンショット 2019-09-18 21.57.47.png

グラデーションの設定

LinerGradientってそれっぽい名前のものがあったから、言われるがままに引数を埋めてみた。

struct ContentView: View {
    
    let backGroundColor = LinearGradient(gradient: Gradient(colors: [Color.blue, Color.green]), startPoint: .top, endPoint: .bottom)
    
    var body: some View {
        ZStack {
            backGroundColor.edgesIgnoringSafeArea(.all)
            Text("Hello World")
        }
    }
}
スクリーンショット 2019-09-18 22.12.04.png

完成形(斜めのグラデーション)

import SwiftUI

struct ContentView: View {
    
    var body: some View {
        ZStack {
            self.backGroundColor().edgesIgnoringSafeArea(.all)
            Text("Hello World")
        }
    }
    
    /// 背景グラデーションを作成する
    private func backGroundColor() -> LinearGradient {
        // 左上から右下にポイントを設定する。
        let start = UnitPoint.init(x: 0, y: 0) // 左上(始点)
        let end = UnitPoint.init(x: 1, y: 1) // 右下(終点)
        
        // 「Color」は以前の「UIColor」からの変換もできるぞ! 助かる。
        let colors = Gradient(colors: [Color(UIColor.blue), Color(UIColor.green)])
        
        let gradientColor = LinearGradient(gradient: colors, startPoint: start, endPoint: end)
        
        return gradientColor
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
スクリーンショット 2019-09-18 22.23.46.png

あとがき

まだSwiftUIチュートリアル2章までしか終わってないけど、やってみたかったので作りました。
まだまだ勉強中ですが使いこなせれば、今までのStoryBoardよりもメンテしやすい設計にできると思います。
MassiveViewControllerからは卒業しよう!

13
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?