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ù)更新中······