swift 開(kāi)發(fā)中的小技巧(純干活)

1. 屏幕寬高提取

應(yīng)用場(chǎng)景:
先看兩行代碼:

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

很多人都是通過(guò)這兩行代碼來(lái)提取屏幕的寬高,然后每次調(diào)用就不用再寫(xiě)一連串的方法調(diào)用了。但是,問(wèn)題來(lái)了。。。如果手機(jī)屏幕支持橫豎屏就會(huì)有問(wèn)題,這兩個(gè)值不會(huì)跟著變。。。此技巧就是解決這一問(wèn)題的。

干貨
思路: 重寫(xiě)其get方法,這樣在取的時(shí)候都會(huì)重新調(diào)用下屏幕的時(shí)時(shí)寬高。

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

補(bǔ)充:橫豎屏的時(shí)候?qū)Ш綑诩訝顟B(tài)欄的高度也是不一樣的,可以按照以下方式設(shè)置

// 導(dǎo)航欄和狀態(tài)欄相加的高度
var kNBarHeight: CGFloat! {
    get {
        return kScreenHeight > kScreenWidth ? 64 : 30
    }
}

2. 日志輸出

應(yīng)用場(chǎng)景:
在項(xiàng)目中,大家經(jīng)常會(huì)通過(guò)日志輸出進(jìn)行功能調(diào)試、bug處理等,但項(xiàng)目上線后,這些都是些無(wú)用功,而且還會(huì)消耗一定的性能,無(wú)論用print()還是debugPrint()都不能避免此問(wèn)題。
在OC中,我們可以通過(guò)宏定義來(lái)自定義一個(gè)日志輸出功能的宏,但是swift中已經(jīng)去除了宏,所以不能再通過(guò)OC的方式進(jìn)行處理。那么此技巧就是幫助大家處理這一問(wèn)題的。

干貨

  • 1、添加flag:
    在Debug環(huán)境下添加flag,在Release條件下就會(huì)不滿足。。。就不會(huì)調(diào)用
Snip20160906_1.png
  • 2、通過(guò)flag過(guò)濾輸入:
func dPrint(item: Any) {
    #if DEBUG
        print(item)
    #endif
}

3. 獲取當(dāng)前控制器

應(yīng)用場(chǎng)景:
獲取當(dāng)前控制器的應(yīng)用場(chǎng)景大家應(yīng)該都有遇到過(guò),這里應(yīng)該也不用去介紹了,直接上代碼。

干貨

// 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出來(lái)的控制器:presentedViewController
        if let presented = base?.presentedViewController {
            return topViewController(presented)
        }
        
        return base
    }
}

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

  • 1、給內(nèi)容設(shè)置行高
// MARK: 文本框內(nèi)容的行間距
// lineSpace:文本行間距, context:文本框內(nèi)容
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、字體的大小根據(jù)文本框的尺寸自適應(yīng)
// MARK: 根據(jù)文本框大小返回字體大小
    // 思路:需要的參數(shù):文本內(nèi)容、文本的寬度、文本的最大字號(hào)
    // 1、通過(guò)文本的內(nèi)容和字號(hào)獲取對(duì)應(yīng)文本的大小
    // 2、比較在此內(nèi)容和字號(hào)下的尺寸的寬度是否小于等于于給定的文本寬度
    // 3、如果滿足,返回字號(hào),如果不滿足,減小字號(hào)再通過(guò)1的步驟去匹配,最終找到合適的
    
    // width:最大寬度, font: 最大字體 , text:文本框內(nèi)容
    func scaleText(content:String, font: CGFloat, width: CGFloat ){
        text = content
        self.font = UIFont.systemFontOfSize(fontWithWidth(width, font: font, text: text!))
    }
    
    // 一個(gè)可遞歸的方法去適配適合的字號(hào)
    func fontWithWidth(width:CGFloat, font: CGFloat, text: NSString) -> CGFloat {
        
        var newfont = font
        
        // 根據(jù)字體大小獲取文本框的大小
        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、色值轉(zhuǎn)換

直接上干貨

extension UIColor {
    
    // RGB整數(shù)值轉(zhuǎn)換
    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進(jìn)制值轉(zhuǎn)換
    convenience init(hexInt: Int) {
        self.init(red:(hexInt >> 16) & 0xff, green:(hexInt >> 8) & 0xff, blue:hexInt & 0xff)
    }
    
    // 字符串轉(zhuǎn)換
    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、字符串轉(zhuǎn)字典
// 字符串轉(zhuǎn)字典
    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、判斷字符串是不是手機(jī)號(hào)
// 是否是電話號(hào)碼
    func isMobilNumber() -> Bool {
        do{
            // 創(chuàng)建規(guī)則
            let pattern = "[1][3578][0-9]{9}"
            
            // 創(chuàng)建對(duì)象
            let regex = try NSRegularExpression(pattern: pattern, options:.CaseInsensitive)
            
            // 開(kāi)始匹配
            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、判斷字符串是不是數(shù)字
 // 判斷是否是數(shù)據(jù)
    func isNumber() -> Bool {
        do{
            // 創(chuàng)建規(guī)則
            let pattern = "^[0-9]+([.]{0,1}[0-9]+){0,1}$"
            
            // 創(chuàng)建對(duì)象
            let regex = try NSRegularExpression(pattern: pattern, options:.CaseInsensitive)
            
            // 開(kāi)始匹配
            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
        }
    }

持續(xù)更新中······

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 179,153評(píng)論 25 708
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,357評(píng)論 0 17
  • 你知道養(yǎng)臺(tái)車(chē)要多少錢(qián)么?今天我們就以一輛15萬(wàn)左右的家用車(chē)為例,算一算用車(chē)10年究竟要花多少錢(qián)? 新車(chē)落地 車(chē)價(jià):...
    汽車(chē)之交流吧閱讀 443評(píng)論 0 1
  • 1. 什么是閉包? 簡(jiǎn)單來(lái)說(shuō),閉包是指可以訪問(wèn)另一個(gè)函數(shù)作用域變量的函數(shù),一般是定義在外層函數(shù)中的內(nèi)層函數(shù)。 2....
    小b俠閱讀 173評(píng)論 0 0
  • 每天,伴著嬌滴滴的叫聲,你起床了 睡眼朦朧中幫你穿好衣服 你開(kāi)心的、蹦跳著去客廳玩…… 你一直那么聽(tīng)話、那么懂事 ...
    江小芳閱讀 482評(píng)論 5 5

友情鏈接更多精彩內(nèi)容