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条件下就会不满足。。。就不会调用
- 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
}
}
持续更新中······