声明枚举以更改应用中用于不同类型用户的颜色

时间:2018-03-19 14:23:02

标签: ios swift enums uicolor

我正在开发一个有两种用户类型的应用程序(管理员,普通用户)。 UITabBar和NavigationBar的颜色根据用户类型而变化。 我如何宣布颜色;

struct Color{
struct NavigationBar{
    static let tintColor =  UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
    static let textColor = UIColor.white
}

我如何打电话;

tabBarController.tabBar.barTintColor = Color.TabBar.tintColor

我可以在我称之为“Color.TabBar”的地方写一个If语句并选择正确的颜色,但我想知道如果我能用enum做到这一点。如下面的代码;

struct Color{
struct NavigationBar{
    enum tintColor{
        case admin
        case user
        var color: UIColor{
            switch self {
            case .admin:
                return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
            case .user:
                return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
            default:
                return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
            }
        }
    }
    //static let tintColor =  UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
    static let textColor = UIColor.white
}

我发现下面的文章,但我认为这与我的问题无关。所以我的问题是我怎么能写那种枚举?

How can I make a Swift enum with UIColor value

3 个答案:

答案 0 :(得分:2)

您实施的方式是正确的,但您需要将用户类型保持为全局。

这就是它需要做的事情;

enum tintColor{
    case admin
    case user
    var tabbarColor: UIColor{
        switch self {
        case .admin:
            return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
        case .user:
            return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
        default:
            return UIColor(red:0.01, green:0.54, blue:0.16, alpha:1.0)
        }
    }
}

static var user = tintColor.user
user.tabbarColor // this returns .user color

答案 1 :(得分:1)

我相信你想要的是不可能的。枚举可能不是一个类,只是一个泛型,一个结构。

但它通常不是你想要的,因为当你拥有许多这些价值时,无论如何都会让你感到一团糟。例如,在某些时候,您将拥有按钮背景颜色,边框颜色和文本颜色。那么你期望你的结果如下:

button.backgroundColor = UIButton.backgroundColor
button.layer.borderColor = UIButton.borderColor.cgColor
button.label.textColor = UIButton.textColor

现在有3个枚举单个组件......这是一个解决方案,但我认为这是一个糟糕的...

我建议你创建一个静态类,并且如此:

class UserApperance {
    static var userType: UserType = .admin

    static var navigationTintColor: UIColor {
        switch userType {
            case .admin: ...
            case .user: ...
        }
    }

}

所以你在代码中所做的就是再次

tabBarController.tabBar.barTintColor = UserApperance.navigationTintColor

当你想对它们进行分组时,你可以使用嵌套:

class UserApperance {
    static var userType: UserType = .admin

    class NavigationBar {
        static var tintColor: UIColor {
            switch UserApperance.userType {
                case .admin: ...
                case .user: ...
            }
        }
    }


}

现在结果更好:

tabBarController.tabBar.barTintColor = UserApperance.NavigationBar.tintColor

在我看来,这是最好的方式,在白色标签应用程序等非常困难的情况下,您可以真正使用嵌套并按屏幕进行操作,甚至可以使用以下代码:

let appearance =  UserAppearance.thisScreenName
titleLabel.textColor = appearance.title.textColor
titleLabel.font = appearance.title.font

提到你可以概括一些事情,甚至可以用作

UserAppearance.thisScreenName.title.configure(label: titleLabel)

可以设置UI元素的所有属性......

但是,如果你真的非常想要拥有它,你仍然可以使用字符串作为颜色或几乎任何原始...

您可以创建

等扩展程序
extension UIView {

    var backgroundColorString: String? {
        set {
            self.backgroundColor = UIColor(hexString: newValue)
        }
        get {
            return self.backgroundColor.toHexString()
        }
    }

}

然后你显然使用这个属性直接从枚举设置颜色。但我不鼓励你这样做。

答案 2 :(得分:1)

好的,所以你有数百万的方法处理这个问题,但请记住你有三个要素:

用户角色变量。当然不仅与UI有关,因此定义在enum UserRole { case user, admin }之类的地方。我们假设您在某处检索此信息,并在视图控制器中注入此变量。

将此用户角色转换为样式的方法。例如,通过使用一些静态函数:

struct Styles {
    struct NavigationBar {
        static func barColor(from userRole:UserRole) -> UIColor {
            switch userRole {
            case .user: return UIColor.blue
            case .admin: return UIColor.blue
            }
        }

        static barFont(from userRole:UserRole) -> UIFont {
            //... do the swith thing again
        }
    }
}

另一个但相关的方法是,如果你开始有更多样式,你也可以从userRole变量创建一个struct实例。

struct Styles {
    struct NavigationBar {
        let color:UIColor
        let font:UIFont

        init(userRole:UserRole) {
            switch userRole {
            case .admin:
                color = .red
                font = UIFont.systemFont(ofSize: 10)
            case .user:
                color = .blue
                font = UIFont.systemFont(ofSize: 16)
            }
        }
    }
}

最后,从你的控制器,只需调用适当的方法来检索样式。这是一个使用简单依赖注入的例子:

let userRole:UserRole

init(userRole:UserRole) {
    self.userRole = userRole
    super.init()
}

required init?(coder aDecoder: NSCoder) { fatalError("init(coder:) is not implemented") }

override func viewDidload() {
    super.viewDidLoad()
    tabBarController.tabBar.barTintColor = Styles.NavigationBar.barColor(from: userRole)
}