Libra Studio Log

開発に関することやゲーム、ガジェットなどについてつらつらと書き記しています

コードでグラデーションのUIViewを作る

f:id:daihase:20190809100049p:plain

こんばんわ、daihaseです。 久々の投稿です。

今日はSwiftでグラデーションのUIViewの作り方を。StoryboardやXibは使わずにコードだけでやってみます。

まずファイル名は何でもいいので、UIViewを継承したカスタムViewを作りましょう。ここではGradientView.swiftというファイルを作り、以下のようなコードを書きました。

import UIKit

class GradientView: UIView {
    fileprivate let startColor: UIColor
    fileprivate let endColor: UIColor
    
    override private init(frame: CGRect) {
        fatalError("init(coder:) has not been implemented")
    }
    
    required public init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    init(frame: CGRect = CGRect.zero, startColor: UIColor, endColor: UIColor) {
        self.startColor = startColor
        self.endColor = endColor
        super.init(frame: frame)
    }

    override func draw(_ rect: CGRect) {
        let colorSpace: CGColorSpace = CGColorSpaceCreateDeviceRGB()
        let context: CGContext = UIGraphicsGetCurrentContext()!
        context.saveGState()
        
        let colors = [self.startColor.cgColor, self.endColor.cgColor]
        let locations: [CGFloat] = [0, 1]
        let gradient: CGGradient = CGGradient(colorsSpace: colorSpace, colors: colors as CFArray, locations: locations)!
        
        let startPoint: CGPoint = CGPoint(x:rect.minX, y: rect.midY)
        let endPoint: CGPoint = CGPoint(x: rect.maxX, y: rect.midY)
        
        context.drawLinearGradient(gradient, start: startPoint, end: endPoint, options: [])
        context.restoreGState()
    }
}

 

カスタムViewを生成する際に、開始時点と終了時点の色情報を与えてグラデーションを表現する感じですね。

ではさっそくUIViewControllerから色情報をセットしカスタムViewを生成してみます。

import UIKit

class ViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let startColor = UIColor(red: 134.0/255.0, green: 0.0/255.0, blue: 0.0/255.0, alpha: 1.0)
        let endColor = UIColor(red: 249.0/255.0, green: 37.0/255.0, blue: 0.0/255.0, alpha: 1.0)
        let gradientView = GradientView(frame: CGRect(x: 0 , y: 0, width: 100, height: 100), startColor: startColor, endColor: endColor)
        gradientView.center = view.center
        
        self.view.addSubview(gradientView)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

 

最初からあるViewController.swiftを使っています。 生成する際にサイズと、開始地点の色情報(ここでは濃い赤)、終了地点の色情報(明るい赤)をセットし、それを画面の中央にくるよう調整。 addSubviewで画面に表示させています。

今回のこれは横方向にグラデーションがかかってますが、方向をenumで定義してやってグラデーションView生成時にその値をセットしてやることで、縦方向のグラデーションViewを表示させたりも簡単に出来ます。

今日はここまで。 それではよいSwiftライフを〜