How to programmatically create UIButton in Swift iOS 10.07.2020

class ExampleViewController: UIViewController {
    lazy var btn: UIButton = {
        let btn = UIButton(type: .system)
        btn.contentEdgeInsets = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
        btn.setTitle("Action", for: .normal)
        btn.layer.cornerRadius = 8.0
        btn.tintColor = .white
        btn.backgroundColor = .red

        btn.addTarget(self, action: #selector(buttonAction), for: .touchUpInside)
        btn.tag = 1
        btn.translatesAutoresizingMaskIntoConstraints = false

        // corner radius for top right, top left
//        btn.clipsToBounds = true
//        btn.layer.cornerRadius = 10
//        btn.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]

        // shadow
//        btn.layer.shadowColor = UIColor.black.cgColor
//        btn.layer.shadowOffset = CGSize(width: 0.0, height: 2.0)
//        btn.layer.shadowRadius = 1.0
//        btn.layer.shadowOpacity = 0.5
        return btn
    }()

    @objc func buttonAction(sender: UIButton!) {
        let btnTag: UIButton = sender
        if btnTag.tag == 1 {
            print("Action")
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        view.addSubview(btn)

        NSLayoutConstraint.activate([
            btn.centerYAnchor.constraint(equalTo: view.centerYAnchor),
            btn.centerXAnchor.constraint(equalTo: view.centerXAnchor)
        ])
    }
}

Add gradient

import UIKit
import SnapKit

class ViewController: UIViewController {
    lazy var btn: UIButton = {
        let btn = UIButton(type: .system)
        btn.contentEdgeInsets = UIEdgeInsets(top: 8, left: 16, bottom: 8, right: 16)
        btn.setTitle("Verify", for: .normal)
        btn.layer.cornerRadius = 8.0
        btn.layer.masksToBounds = true
        btn.tintColor = .white
        btn.backgroundColor = .red
        btn.addTarget(self, action: #selector(onVerifyTapped), for: .touchUpInside)
        return btn
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        btn.applyGradient(colours: [.systemYellow, .systemPink])
    }

    @objc func onVerifyTapped(sender: UIButton!) {
    }

    func setupUI() {
        self.view.addSubview(btn)

        btn.snp.makeConstraints { (make) -> Void in
            make.top.equalTo(otpView.snp.bottom).offset(16)
            make.centerX.equalTo(self.view)
        }
    }
}

extension UIView {
    @discardableResult
    func applyGradient(colours: [UIColor]) -> CAGradientLayer {
        return self.applyGradient(colours: colours, locations: nil)
    }

    @discardableResult
    func applyGradient(colours: [UIColor], locations: [NSNumber]?) -> CAGradientLayer {
        let gradient: CAGradientLayer = CAGradientLayer()
        gradient.frame = self.bounds
        gradient.colors = colours.map { $0.cgColor }
        gradient.locations = locations
        gradient.startPoint = CGPoint(x: 0.0, y: 1.0)
        gradient.endPoint = CGPoint(x: 1.0, y: 1.0)
        self.layer.insertSublayer(gradient, at: 0)
        return gradient
    }
}

Custom button

@IBDesignable
class GradientButton: UIButton {
    let gradientLayer = CAGradientLayer()

    @IBInspectable
    var topGradientColor: UIColor? {
        didSet {
            setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
        }
    }

    @IBInspectable
    var bottomGradientColor: UIColor? {
        didSet {
            setGradient(topGradientColor: topGradientColor, bottomGradientColor: bottomGradientColor)
        }
    }

    private func setGradient(topGradientColor: UIColor?, bottomGradientColor: UIColor?) {
        if let topGradientColor = topGradientColor, let bottomGradientColor = bottomGradientColor {
            gradientLayer.frame = bounds
            gradientLayer.colors = [topGradientColor.cgColor, bottomGradientColor.cgColor]
            gradientLayer.borderColor = layer.borderColor
            gradientLayer.borderWidth = layer.borderWidth
            gradientLayer.cornerRadius = layer.cornerRadius
            layer.insertSublayer(gradientLayer, at: 0)
        } else {
            gradientLayer.removeFromSuperlayer()
        }
    }
}