swift 开发中的小技巧(纯干活)

1. 屏幕宽高提取

应用场景:
先看两行代码:

let kScreenWidth  = UIScreen.mainScreen().bounds.size.width
let kScreenHeight = UIScreen.mainScreen().bounds.size.height

很多人都是通过这两行代码来提取屏幕的宽高,然后每次调用就不用再写一连串的方法调用了。但是,问题来了。。。如果手机屏幕支持横竖屏就会有问题,这两个值不会跟着变。。。此技巧就是解决这一问题的。

干货
思路: 重写其get方法,这样在取的时候都会重新调用下屏幕的时时宽高。

// 屏幕宽度
var kScreenWidth: CGFloat! {
    get{
        return UIScreen.mainScreen().bounds.size.width
    }
}
// 屏幕高度
var kScreenHeight: CGFloat! {
    get{
        return UIScreen.mainScreen().bounds.size.height
    }
}

补充:横竖屏的时候导航栏加状态栏的高度也是不一样的,可以按照以下方式设置

// 导航栏和状态栏相加的高度
var kNBarHeight: CGFloat! {
    get {
        return kScreenHeight > kScreenWidth ? 64 : 30
    }
}

2. 日志输出

应用场景:
在项目中,大家经常会通过日志输出进行功能调试、bug处理等,但项目上线后,这些都是些无用功,而且还会消耗一定的性能,无论用print()还是debugPrint()都不能避免此问题。
在OC中,我们可以通过宏定义来自定义一个日志输出功能的宏,但是swift中已经去除了宏,所以不能再通过OC的方式进行处理。那么此技巧就是帮助大家处理这一问题的。

干货

  • 1、添加flag:
    在Debug环境下添加flag,在Release条件下就会不满足。。。就不会调用
Snip20160906_1.png
  • 2、通过flag过滤输入:
func dPrint(item: Any) {
    #if DEBUG
        print(item)
    #endif
}

3. 获取当前控制器

应用场景:
获取当前控制器的应用场景大家应该都有遇到过,这里应该也不用去介绍了,直接上代码。

干货

// MARK: UIApplication
extension UIApplication {
    
    // 最顶部的控制器
    // base:第一次取屏幕的跟控制器
    class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? {
        
        // 是否有UINavigationController
        if let nav = base as? UINavigationController {
            // 在nav跟控制器中查找
            return topViewController(nav.visibleViewController)
        }
        
        // 是否有UITabBarController
        if let tab = base as? UITabBarController {
            // 在tab选中的控制器中查找
            if let selected = tab.selectedViewController {
                return topViewController(selected)
            }
        }
        
        // base是否有model出来的控制器:presentedViewController
        if let presented = base?.presentedViewController {
            return topViewController(presented)
        }
        
        return base
    }
}

4、文本框(UILabel)的一些技巧

  • 1、给内容设置行高
// MARK: 文本框内容的行间距
// lineSpace:文本行间距, context:文本框内容
func textWithLineSpaceing(context:String, lineSpace:CGFloat){
    let attr = NSMutableAttributedString(string: context)
    let paragraphStyle = NSMutableParagraphStyle()
    paragraphStyle.lineSpacing = lineSpace
    attr.addAttributes([NSParagraphStyleAttributeName:paragraphStyle], range: NSRange(location: 0,length: context.characters.count))
    attributedText = attr
}
  • 2、字体的大小根据文本框的尺寸自适应
// MARK: 根据文本框大小返回字体大小
    // 思路:需要的参数:文本内容、文本的宽度、文本的最大字号
    // 1、通过文本的内容和字号获取对应文本的大小
    // 2、比较在此内容和字号下的尺寸的宽度是否小于等于于给定的文本宽度
    // 3、如果满足,返回字号,如果不满足,减小字号再通过1的步骤去匹配,最终找到合适的
    
    // width:最大宽度, font: 最大字体 , text:文本框内容
    func scaleText(content:String, font: CGFloat, width: CGFloat ){
        text = content
        self.font = UIFont.systemFontOfSize(fontWithWidth(width, font: font, text: text!))
    }
    
    // 一个可递归的方法去适配适合的字号
    func fontWithWidth(width:CGFloat, font: CGFloat, text: NSString) -> CGFloat {
        
        var newfont = font
        
        // 根据字体大小获取文本框的大小
        let size = text.boundingRectWithSize(CGSize(), options: [.UsesFontLeading, .UsesLineFragmentOrigin], attributes: [NSFontAttributeName:UIFont.systemFontOfSize(newfont)], context: nil).size
        
        // 递归适配
        if size.width > width {
            newfont--
            newfont = fontWithWidth(width, font: newfont, text: text)
        }
        return newfont
    }

5、色值转换

直接上干货

extension UIColor {
    
    // RGB整数值转换
    convenience init(red: Int, green: Int, blue: Int , alp: CGFloat = 1.0 ) {
        assert(red >= 0 && red <= 255, "Invalid red component")
        assert(green >= 0 && green <= 255, "Invalid green component")
        assert(blue >= 0 && blue <= 255, "Invalid blue component")
        
        self.init(red: CGFloat(red) / 255.0, green: CGFloat(green) / 255.0, blue: CGFloat(blue) / 255.0, alpha: alp)
    }
    
    // 16进制值转换
    convenience init(hexInt: Int) {
        self.init(red:(hexInt >> 16) & 0xff, green:(hexInt >> 8) & 0xff, blue:hexInt & 0xff)
    }
    
    // 字符串转换
    convenience init(hexString: String) {
        
        var hexStr = hexString.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet() as NSCharacterSet).uppercaseString
        
        if (hexStr.hasPrefix("#")) {
            hexStr = hexStr.substringFromIndex(hexStr.startIndex.advancedBy(1))
        }
    
        var hexInt: UInt32 = 0
        NSScanner(string: hexStr).scanHexInt(&hexInt)
        
        self.init(red: Int((hexInt >> 16) & 0xff), green: Int((hexInt >> 8) & 0xff), blue: Int(hexInt & 0xff))
    }
}

6、字符串的一些技巧

  • 1、字符串转字典
// 字符串转字典
    func toDictionary() -> [String:AnyObject]? {
        let data = self.dataUsingEncoding(NSUTF8StringEncoding)
        do {
            return try NSJSONSerialization.JSONObjectWithData(data!, options: .MutableContainers) as? [String : AnyObject]
        } catch {
            // ruturn ""
            return nil
        }
    }
  • 2、判断字符串是不是手机号
// 是否是电话号码
    func isMobilNumber() -> Bool {
        do{
            // 创建规则
            let pattern = "[1][3578][0-9]{9}"
            
            // 创建对象
            let regex = try NSRegularExpression(pattern: pattern, options:.CaseInsensitive)
            
            // 开始匹配
            let range = NSMakeRange(0, self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            let phoneRange = regex.rangeOfFirstMatchInString(self, options: .ReportProgress, range: range)
            if range.length == phoneRange.length && range.location == phoneRange.location {
                return true
            }
            
            return false
        }catch{
            print(error)
            return false
        }
    }
  • 3、判断字符串是否包含中文汉字
// 是否包含中文:
    func isContainChinese() -> Bool {
        let NSS: NSString = NSString(format:"%@",self)
        for index in 0...NSS.length-1 {
            let c = NSS.characterAtIndex(index)
            if c > 0x4e00 && c < 0x9fff {
                return true
            }
        }
        return false
    }
  • 4、判断字符串是不是数字
 // 判断是否是数据
    func isNumber() -> Bool {
        do{
            // 创建规则
            let pattern = "^[0-9]+([.]{0,1}[0-9]+){0,1}$"
            
            // 创建对象
            let regex = try NSRegularExpression(pattern: pattern, options:.CaseInsensitive)
            
            // 开始匹配
            let range = NSMakeRange(0, self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))
            let phoneRange = regex.rangeOfFirstMatchInString(self, options: .ReportProgress, range: range)
            if range.length == phoneRange.length && range.location == phoneRange.location {
                return true
            }
            return false
        } catch {
            return false
        }
    }

持续更新中······

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容