zoukankan      html  css  js  c++  java
  • UIColor-Hex-Swift

    //
    //  UIColorExtension.swift
    //  HEXColor
    //
    //  Created by R0CKSTAR on 6/13/14.
    //  Copyright (c) 2014 P.D.Q. All rights reserved.
    //
    
    import UIKit
    
    /**
     MissingHashMarkAsPrefix:   "Invalid RGB string, missing '#' as prefix"
     UnableToScanHexValue:      "Scan hex error"
     MismatchedHexStringLength: "Invalid RGB string, number of characters after '#' should be either 3, 4, 6 or 8"
     */
    public enum UIColorInputError : ErrorType {
        case MissingHashMarkAsPrefix,
        UnableToScanHexValue,
        MismatchedHexStringLength
    }
    
    extension UIColor {
        /**
         The shorthand three-digit hexadecimal representation of color.
         #RGB defines to the color #RRGGBB.
         
         - parameter hex3: Three-digit hexadecimal value.
         - parameter alpha: 0.0 - 1.0. The default is 1.0.
         */
        public convenience init(hex3: UInt16, alpha: CGFloat = 1) {
            let divisor = CGFloat(15)
            let red     = CGFloat((hex3 & 0xF00) >> 8) / divisor
            let green   = CGFloat((hex3 & 0x0F0) >> 4) / divisor
            let blue    = CGFloat( hex3 & 0x00F      ) / divisor
            self.init(red: red, green: green, blue: blue, alpha: alpha)
        }
        
        /**
         The shorthand four-digit hexadecimal representation of color with alpha.
         #RGBA defines to the color #RRGGBBAA.
         
         - parameter hex4: Four-digit hexadecimal value.
         */
        public convenience init(hex4: UInt16) {
            let divisor = CGFloat(15)
            let red     = CGFloat((hex4 & 0xF000) >> 12) / divisor
            let green   = CGFloat((hex4 & 0x0F00) >>  8) / divisor
            let blue    = CGFloat((hex4 & 0x00F0) >>  4) / divisor
            let alpha   = CGFloat( hex4 & 0x000F       ) / divisor
            self.init(red: red, green: green, blue: blue, alpha: alpha)
        }
        
        /**
         The six-digit hexadecimal representation of color of the form #RRGGBB.
         
         - parameter hex6: Six-digit hexadecimal value.
         */
        public convenience init(hex6: UInt32, alpha: CGFloat = 1) {
            let divisor = CGFloat(255)
            let red     = CGFloat((hex6 & 0xFF0000) >> 16) / divisor
            let green   = CGFloat((hex6 & 0x00FF00) >>  8) / divisor
            let blue    = CGFloat( hex6 & 0x0000FF       ) / divisor
            self.init(red: red, green: green, blue: blue, alpha: alpha)
        }
        
        /**
         The six-digit hexadecimal representation of color with alpha of the form #RRGGBBAA.
         
         - parameter hex8: Eight-digit hexadecimal value.
         */
        public convenience init(hex8: UInt32) {
            let divisor = CGFloat(255)
            let red     = CGFloat((hex8 & 0xFF000000) >> 24) / divisor
            let green   = CGFloat((hex8 & 0x00FF0000) >> 16) / divisor
            let blue    = CGFloat((hex8 & 0x0000FF00) >>  8) / divisor
            let alpha   = CGFloat( hex8 & 0x000000FF       ) / divisor
            self.init(red: red, green: green, blue: blue, alpha: alpha)
        }
        
        /**
         The rgba string representation of color with alpha of the form #RRGGBBAA/#RRGGBB, throws error.
         
         - parameter rgba: String value.
         */
        public convenience init(rgba_throws rgba: String) throws {
            guard rgba.hasPrefix("#") else {
                throw UIColorInputError.MissingHashMarkAsPrefix
            }
            
            guard let hexString: String = rgba.substringFromIndex(rgba.startIndex.advancedBy(1)),
                var   hexValue:  UInt32 = 0
                where NSScanner(string: hexString).scanHexInt(&hexValue) else {
                    throw UIColorInputError.UnableToScanHexValue
            }
            
            guard hexString.characters.count  == 3
                || hexString.characters.count == 4
                || hexString.characters.count == 6
                || hexString.characters.count == 8 else {
                    throw UIColorInputError.MismatchedHexStringLength
            }
            
            switch (hexString.characters.count) {
            case 3:
                self.init(hex3: UInt16(hexValue))
            case 4:
                self.init(hex4: UInt16(hexValue))
            case 6:
                self.init(hex6: hexValue)
            default:
                self.init(hex8: hexValue)
            }
        }
        
        /**
         The rgba string representation of color with alpha of the form #RRGGBBAA/#RRGGBB, fails to default color.
         
         - parameter rgba: String value.
         */
        public convenience init(rgba: String, defaultColor: UIColor = UIColor.clearColor()) {
            guard let color = try? UIColor(rgba_throws: rgba) else {
                self.init(CGColor: defaultColor.CGColor)
                return
            }
            self.init(CGColor: color.CGColor)
        }
        
        /**
         Hex string of a UIColor instance.
         
         - parameter rgba: Whether the alpha should be included.
         */
        public func hexString(includeAlpha: Bool) -> String {
            var r: CGFloat = 0
            var g: CGFloat = 0
            var b: CGFloat = 0
            var a: CGFloat = 0
            self.getRed(&r, green: &g, blue: &b, alpha: &a)
            
            if (includeAlpha) {
                return String(format: "#%02X%02X%02X%02X", Int(r * 255), Int(g * 255), Int(b * 255), Int(a * 255))
            } else {
                return String(format: "#%02X%02X%02X", Int(r * 255), Int(g * 255), Int(b * 255))
            }
        }
        
        public override var description: String {
            return self.hexString(true)
        }
        
        public override var debugDescription: String {
            return self.hexString(true)
        }
    }
    

     项目地址:https://github.com/yeahdongcn/UIColor-Hex-Swift

  • 相关阅读:
    LeetCode 538----Convert BST to Greater Tree
    LeetCode 543---- Diameter of Binary Tree
    springboot请求体中的流只能读取一次的问题
    bind9+dlz+mysql连接断开问题
    关于Java的Object.clone()方法与对象的深浅拷贝
    HashSet怎样保证元素不重复
    percona-toolkit主从同步整理(MySQL)
    MySQL主从配置
    关于自动化部署平台的尝试
    struts2使用注解的时候遇到的问题
  • 原文地址:https://www.cnblogs.com/Free-Thinker/p/5106043.html
Copyright © 2011-2022 走看看