summaryrefslogtreecommitdiffhomepage
path: root/ios/MullvadVPN/Views/CustomButton.swift
blob: 8c6a9b65f41917f24c9c0ddd4c8d957264e17ba6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
//
//  CustomButton.swift
//  MullvadVPN
//
//  Created by pronebird on 23/05/2019.
//  Copyright © 2025 Mullvad VPN AB. All rights reserved.
//

import UIKit

extension UIControl.State {
    var customButtonTitleColor: UIColor? {
        switch self {
        case .normal:
            return UIColor.AppButton.normalTitleColor
        case .disabled:
            return UIColor.AppButton.disabledTitleColor
        case .highlighted:
            return UIColor.AppButton.highlightedTitleColor
        default:
            return nil
        }
    }
}

/// A custom `UIButton` subclass that implements additional layouts for the image
class CustomButton: UIButton, Sendable {
    var imageAlignment: NSDirectionalRectEdge = .leading {
        didSet {
            self.configuration?.imagePlacement = imageAlignment
        }
    }

    var inlineImageSpacing: CGFloat = 4 {
        didSet {
            self.configuration?.imagePadding = inlineImageSpacing
        }
    }

    var titleAlignment: UIButton.Configuration.TitleAlignment = .center {
        didSet {
            self.configuration?.titleAlignment = titleAlignment
        }
    }

    var inlineTitleSpacing: CGFloat = 4 {
        didSet {
            self.configuration?.titlePadding = inlineTitleSpacing
        }
    }

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }

    private func commonInit() {
        var config = UIButton.Configuration.plain()
        config.imagePadding = inlineImageSpacing
        config.imagePlacement = imageAlignment
        config.titleAlignment = titleAlignment
        config.titleLineBreakMode = .byWordWrapping
        config.titlePadding = inlineTitleSpacing
        config.baseForegroundColor = state.customButtonTitleColor
        self.configuration = config
    }
}