CocoaPods trunk is moving to be read-only. Read more on the blog, there are 18 months to go.

OMExtension 3.0.3

OMExtension 3.0.3

TestsTested
LangLanguage SwiftSwift
License MIT
ReleasedLast Release Oct 2018
SPMSupports SPM

Maintained by OctMon.



OMExtension

Carthage compatible CocoaPods Compatible

Requirements

  • iOS 8.0+ / tvOS 9.0+ / watchOS 2.0+ / macOS 10.10+
  • Xcode 9+
  • Swift 4.0+
  • Swift 3 use OMExtension 2.2.x
  • Swift 2.3 use OMExtension 1.0.x

安装和使用

Git Submodule

Execute:

git submodule add https://github.com/OctMon/OMExtension.git

in your repository folder.

Carthage

Add the following line to your Cartfile.

github "OctMon/OMExtension"

Then run carthage update --no-use-binaries or just carthage update. For details of the installation and usage of Carthage, visit it's project page.

CocoaPods

Add the following lines to your Podfile.

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!

pod 'OMExtension'

# swift <= 2.3 use
# pod 'OMExtension', '< 1.1'

Then run pod install. For details of the installation and usage of CocoaPods, visit it's official web site.

使用时在任意swift文件导入一次即可

import OMExtension

Foundation

UIKit

Array

let number = [Int](10...20)
number.omRandom() // Optional((1, 11))
number.omAtIndex(3) // Optional(13)
number.omAtIndex(33) // nil
number.omDifference([10, 11], [17, 18]) // [12, 13, 14, 15, 16, 19, 20]
[Int](1...10).omUnion(number, [21, 22]) // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22]
number.omIntersection([Int](10...13), [11, 12]) // [10, 11, 12, 13]

// 不重复随机数
var random = [0, 1, 2, 3, 4, 5]
dump(random)
   
for _ in 0...random.count {
  
  print("随机数:" + "\(random.omPopRandom()?.element)")
  print(random)
}

/*
▿ 6 elements
  - 0
  - 1
  - 2
  - 3
  - 4
  - 5
随机数:Optional(1)
[0, 2, 3, 4, 5]
随机数:Optional(5)
[0, 2, 3, 4]
随机数:Optional(0)
[2, 3, 4]
随机数:Optional(3)
[2, 4]
随机数:Optional(4)
[2]
随机数:Optional(2)
[]
随机数:nil
[]
*/

Bool

var isValid = false
print(isValid.omToInt) // 0
isValid.omToggle()
print(isValid) // true
print(isValid.omToInt) // 1

Data

Data转json

httpBody?.omToJson()

Any转json

Data.OM.JSONString(from: allHTTPHeaderFields)

Date

date.omYearString // 2016
date.omMonthString // August
date.omWeekdayString // Monday
date.omDateInfo().month // 8
date.omDateInfo() // OMDateInfo(year: 2016, month: 8, day: 29, weekday: 5, hour: 15, minute: 29, second: 21, nanosecond: 898715019)
date.omDateInfo().string(nanosecond: true) // 2016-08-29 15:29:21:899

Dictionary

let first = ["b": 98, "a": 97, "c": 99]
let second = ["b": 98, "e": 101, "a": 97, "f": 102, "d": 100]

first.omRandom() // ("c", 99)
first.omUnion(second) // ["b": 98, "e": 101, "a": 97, "f": 102, "d": 100, "c": 99]
first.omDifference(second) // ["c": 99]
first.omIntersection(second) // ["b": 98, "a": 97]
second.omFilter({ (key, value) -> Bool in
    value > 100
}) // ["e": 101, "f": 102]

Double

let double: Double = 100.0

print(type(of: double.omToInt)) // Int
print(type(of: double.omToDate)) // Date
print(type(of: double.omToString)) // String
print(100.58.omToDecimalStyle()) // 100.58
print(100.58654.omToDecimalStyle()) // 100.59
print(123.456.omToDecimalStyle(3)) // 123.456

let date = (Date().timeIntervalSince1970 * 1000).omToDate
print(date) // 2016-11-17 08:28:16 +0000

print(12345.678.omLocaleCurrency) // $12,345.68
        
let abs = -12345.67
print(abs.omAbs) // 12345.67

let double = 12345.67
print(double.omFloor) // 12345.0
print(double.omCeil) // 12346.0
print(double.omToDigits) // [1, 2, 3, 4, 5, 6, 7]

FileManager

在cachesDirectory创建download目录

FileManager.OM.createDirectory(for: .cachesDirectory, path: "download")

获取 documentDirectory

print(FileManager.OM.getDocument())
// file:///Users/octmon/Library/Developer/CoreSimulator/Devices/1C975A61-2498-44AE-BBEE-BF921A246E5B/data/Containers/Data/Application/C62F47FB-625E-453B-AB34-B0CA51296F36/Documents/

获取 cachesDirectory中download目录

print(FileManager.OM.getCaches(path: "download").path)
// /Users/octmon/Library/Developer/CoreSimulator/Devices/1C975A61-2498-44AE-BBEE-BF921A246E5B/data/Containers/Data/Application/C62F47FB-625E-453B-AB34-B0CA51296F36/Library/Caches/download

documentDirectory中user.dat是否存在

print(FileManager.OM.fileExists(path: "user.dat") ?? false)
print(FileManager.OM.fileExists(for: .cachesDirectory, path: "download") ?? false)
print(FileManager.OM.fileExists(at: FileManager.OM.getDocument(path: "user.dat")) ?? false)

// nil
// Optional(file:///Users/octmon/Library/Developer/CoreSimulator/Devices/1C975A61-2498-44AE-BBEE-BF921A246E5B/data/Containers/Data/Application/A7108007-93D6-4C0D-99E4-0D2BC6474D6C/Library/Caches/download/)
// nil

获取文件大小

print(FileManager.OM.getFileSize(at: FileManager.OM.getCaches(path: "download")))

// 68

获取磁盘空闲空间大小

FileManager.OM.getDiskFreeSpace
FileManager.OM.getDiskFreeSpaceString

删除文件

FileManager.OM.removeItem(at: FileManager.OM.getDocument(path: "user.data"))
FileManager.OM.removeItem(path: "user.data")

Int

let int: Int = 123

print(int.omToFloat) // 123.0
print(int.omToDouble) // 123.0
print(type(of: int.omToString)) // String
print(type(of: int.omToFloat)) // Float
print(type(of: int.omToDouble)) // Double
print(int.omIsOdd) // true
print(int.omIsEven) // false

print(12345.omLocaleCurrency) // $12,345.00

let abs = -12345
print(abs.omAbs) // 12345

NSObject

获取类型名称

print(NSObject.omClassName) // NSObject
print(UIApplication.shared.om.className) // UIApplication
print(om.deinitLog) // ApplicationTVC♻️deinit

String

类型转换

let string: String = "128.00"
        
print(string.omToDouble) // Optional(128.0)
print(string.omToFloat) // Optional(128.0)
print(string.omToInt) // Optional(128)
print(string.omToBool) // nil
print("2016-12-31".omToDate) // Optional(2016-12-30 16:00:00 +0000)
print("2016-12-31 12:01:02".omToDateTime) // Optional(2016-12-31 04:01:02 +0000)

print(type(of: string.omToDouble)) // Optional<Double>
print(type(of: string.omToFloat)) // Optional<Float>
print(type(of: string.omToInt)) // Optional<Int>
print(type(of: string.omToBool)) // Optional<Bool>
print(type(of: "2016-12-31".omToDate)) // Optional<Date>
print(type(of: "2016-12-31 12:01:02".omToDateTime)) // Optional<Date>

手机号验证

string.omIsIP

电话号码验证

string.omIsPhoneTelephone

邮箱验证

string.omIsEmail

URL网址验证

string.omIsURL

IP地址验证

string.omIsIP

纯数字验证

string.omIsNumber

身份证号验证

string.omIsIDCard

Http验证

print("https://github.com/OctMon".omIsHttpUrl) // false

Https验证

print("https://github.com/OctMon".omIsHttpsUrl) // true

URL网址验证

print("octmon://github.com/OctMon".omIsURL) // true

提取URL

print("https://github.com/OctMon 关注 start http http://google.com".omExtractURL) // [https://github.com/OctMon, http://google.com]

复制文本

"https://github.com/OctMon".omCopyToPasteboard()

计算高度

print("https://github.com/OctMon".omHeight(320, font: UIFont.systemFontOfSize(12))) // 15.0

计算高度

print("   https://github.com/OctMon  ".omTrimming) // https://github.com/OctMon

字符串分离

print("https:// github. com/ OctMon  ".omSplit(" ")[3]) // OctMon

字符串包含

print("https://github.com/OctMon".omContain("OctMon")) // true
print("https://github.com/OctMon".omCount(of: "git")) // 1
print("https://github.com/OctMon".omHasPrefix("https")) // true
print("https://github.com/OctMon".omHasSuffix("octmon")) // false
print("https://github.com/OctMon".omHasSuffix("octmon", caseSensitive: false)) // true

字符串中间添加分割符

print("123".omJoinSeparator(" ")) // 1 2 3

字符串去空格、回车

print(" Opti onal <Da te> ".omTrimming) // Opti onal <Da te>
print(" Opti onal <Da te> ".omTrimmingWithoutSpacesAndNewLines) // Optional<Date>

字符串反转

print("https://github.com/OctMon".omReversed) // noMtcO/moc.buhtig//:sptth

Base64

print("http://github.com/OctMon".omBase64Encoded) // Optional("aHR0cDovL2dpdGh1Yi5jb20vT2N0TW9u")
print("aHR0cDovL2dpdGh1Yi5jb20vT2N0TW9u".omBase64Decoded) // Optional("http://github.com/OctMon")

获取子串的NSRange

print("https://github.com/OctMon".omGetRanges("OctMon")) // [(19,6)]

NSMutableAttributedString

let mutableAttributedString = ("https://github.com/OctMon".omGetAttributes(color: [(color: UIColor.redColor(), subString: "github")], font: [(font: UIFont.systemFontOfSize(12), subString: "Octmon")]))

let attributes = text.omGetAttributes(lineSpacing: 10)

Thread

Thread.OM.runInMain(delay: 1) {
    // 1s后在主线程执行
}

Thread.OM.runInGlobal(qos: .background, delay: 5) {
    // code
}

Timer

Timer.OM.runLoop(seconds: 1, handler: { (timer) in
            
    total-=1
    print(total)

    if total <= 0 && timer.valid {

        timer.invalidate()

        print("invalidate")
    }
})

URLRequest

打印请求、响应日志

requestMyServers(urlRequest: URLRequest(url: URL(string: "http://itunes.apple.com/US/lookup?id=414478124")!))?.responseMyServers(completionHandler: { (_) in

})

封装请求 Alamofire

import Alamofire

/**
 请求前打印日志
 
 - parameter URLRequest: 路由
 
 - returns: Request
 */
@discardableResult
func requestMyServers(urlRequest: URLRequestConvertible) -> DataRequest? {
    
    urlRequest.urlRequest?.omPrintRequestLog()
    
    return request(urlRequest).validate()
}

extension DataRequest {
    
    /**
     收到请求
     
     - parameter handler: 回调
     */
    func responseMyServers(completionHandler: @escaping (DataResponse<Any>) -> Void) {
        
        responseJSON { (response) in
            
            self.request?.omPrintResponseLog(response: response.response, data: response.data, error: response.result.error, requestDuration: response.timeline.requestDuration)
            
            completionHandler(response)
        }
    }
}
urlRequest.urlRequest?.omPrintRequestLog()

->->->->->->->->->->Request->->->->->->->->->
[URL]		http://itunes.apple.com/US/lookup?id=414478124
[Method]	GET
[Timeout]	60.0
->->->->->->->->->->Request->->->->->->->->->
self.request?.omPrintResponseLog(response: response.response, data: response.data, error: response.result.error, requestDuration: response.timeline.requestDuration)

->->->->->->->->->->Response->->->->->->->->->
[URL]		http://itunes.apple.com/US/lookup?id=414478124
[Method]	GET
[Timeout]	60.0
----------------------200------------------->
[Duration]	0.757575988769531
[Size]		4958 bytes
[Data]
{
  "resultCount" : 1,
  "results" : [
    {
      "artistId" : 614694882,
      "version" : "6.3.30",
      "primaryGenreName" : "Social Networking",
      "genreIds" : [
        "6005",
        "6007"
      ],
      "artworkUrl60" : "http:\/\/is5.mzstatic.com\/image\/thumb\/Purple71\/v4\/fe\/ed\/a1\/feeda179-73fc-0460-48c0-194997842dac\/source\/60x60bb.jpg",
      "userRatingCountForCurrentVersion" : 3,
      "minimumOsVersion" : "7.0",
      "appletvScreenshotUrls" : [

      ],
      "sellerName" : "Tencent Technology (Shenzhen) Company Limited",
      "supportedDevices" : [
        "iPhone4",
        "iPad2Wifi",
        "iPad23G",
        "iPhone4S",
        "iPadThirdGen",
        "iPadThirdGen4G",
        "iPhone5",
        "iPodTouchFifthGen",
        "iPadFourthGen",
        "iPadFourthGen4G",
        "iPadMini",
        "iPadMini4G",
        "iPhone5c",
        "iPhone5s",
        "iPhone6",
        "iPhone6Plus",
        "iPodTouchSixthGen"
      ],
      "genres" : [
        "Social Networking",
        "Productivity"
      ],
      "currentVersionReleaseDate" : "2016-11-03T08:38:20Z",
      "trackName" : "WeChat",
      "isVppDeviceBasedLicensingEnabled" : true,
      "description" : "Over half a billion people use WeChat, the free messaging & calling app that allows you to easily connect with family & friends across countries. It’s the all-in-one communications app for free text (SMS\/MMS), voice & video calls, moments, photo sharing, and games.\nWHY USE WECHAT:\n• ALWAYS FREE: No annual subscription fee. Absolutely free for life.\n• FREE VOICE & VIDEO CALLS: High-quality free calls to anywhere in the world.\n• GROUP CHAT: Create group chats with up to 500 people.\n• MULTIMEDIA MESSAGING: Send video, image, text, and voice messages.\n• STICKER GALLERY: Hundreds of free fun, animated stickers to express your feelings from some of your favorite cartoons and movies.\n• MOMENTS: Share your best moments on your personal photo stream.\n• BETTER PRIVACY: WeChat gives you the highest level of control over your privacy. It’s the only messaging app to be certified by TRUSTe.\n• MEET NEW FRIENDS: Use “Friend Radar”, “People Nearby” and “Shake” to meet others.\n• ADDICTIVE GAMES: Compete with your friends on some of the hottest games.\n• REALTIME LOCATION: Instead of having to tell others where you are, just use real-time location sharing.\n• LANGUAGE SUPPORT: Localized in 20 different languages and can translate messages to any language\n• AND MORE: Desktop app, custom wallpaper, custom notifications, group walkie-talkie, official accounts.\n• WeRun-WeChat: Access HealthKit data and challenge friends to beat their scores via the \"WeRun-WeChat\" Official Account.",
      "price" : 0,
      "trackId" : 414478124,
      "releaseDate" : "2011-01-21T01:32:15Z",
      "advisories" : [
        "Infrequent\/Mild Sexual Content and Nudity"
      ],
      "screenshotUrls" : [
        "http:\/\/a2.mzstatic.com\/us\/r30\/Purple62\/v4\/67\/a9\/67\/67a96743-3a1f-8df2-d27c-b268873aa000\/screen696x696.jpeg",
        "http:\/\/a1.mzstatic.com\/us\/r30\/Purple71\/v4\/18\/13\/c2\/1813c2dd-98b9-bb2d-ec89-bdf14a29a9c8\/screen696x696.jpeg",
        "http:\/\/a1.mzstatic.com\/us\/r30\/Purple62\/v4\/04\/fe\/b8\/04feb813-ca57-ff65-0c03-186cf21047df\/screen696x696.jpeg",
        "http:\/\/a4.mzstatic.com\/us\/r30\/Purple71\/v4\/d9\/91\/71\/d99171d9-0fb3-930f-3d78-1c0cdf8326e9\/screen696x696.jpeg",
        "http:\/\/a1.mzstatic.com\/us\/r30\/Purple62\/v4\/c1\/4f\/11\/c14f1147-0ea1-a0bc-04a1-139fe7fc800e\/screen696x696.jpeg"
      ],
      "artistViewUrl" : "https:\/\/itunes.apple.com\/us\/developer\/wechat\/id614694882?uo=4",
      "primaryGenreId" : 6005,
      "userRatingCount" : 33284,
      "averageUserRatingForCurrentVersion" : 3,
      "kind" : "software",
      "fileSizeBytes" : "158753792",
      "sellerUrl" : "http:\/\/www.wechat.com",
      "trackContentRating" : "12+",
      "bundleId" : "com.tencent.xin",
      "trackCensoredName" : "WeChat",
      "contentAdvisoryRating" : "12+",
      "isGameCenterEnabled" : false,
      "artistName" : "WeChat",
      "languageCodesISO2A" : [
        "AR",
        "ZH",
        "EN",
        "FR",
        "DE",
        "HE",
        "HI",
        "ID",
        "IT",
        "JA",
        "KO",
        "MS",
        "PL",
        "PT",
        "RU",
        "ZH",
        "ES",
        "TH",
        "ZH",
        "TR",
        "VI"
      ],
      "releaseNotes" : "Latest Updates:\n- Minor bug fixes.\n\nRecent Updates:\n- Group owner can verify members' invitation before they invite their friends to join the group.\n- Added Go Dutch to group chats allowing you to split bills quickly with your friends.\n- Send animated GIFs in chats.",
      "features" : [
        "iosUniversal"
      ],
      "averageUserRating" : 4.5,
      "wrapperType" : "software",
      "artworkUrl512" : "http:\/\/is5.mzstatic.com\/image\/thumb\/Purple71\/v4\/fe\/ed\/a1\/feeda179-73fc-0460-48c0-194997842dac\/source\/512x512bb.jpg",
      "artworkUrl100" : "http:\/\/is5.mzstatic.com\/image\/thumb\/Purple71\/v4\/fe\/ed\/a1\/feeda179-73fc-0460-48c0-194997842dac\/source\/100x100bb.jpg",
      "trackViewUrl" : "https:\/\/itunes.apple.com\/us\/app\/wechat\/id414478124?mt=8&uo=4",
      "formattedPrice" : "Free",
      "currency" : "USD",
      "ipadScreenshotUrls" : [
        "http:\/\/a5.mzstatic.com\/us\/r30\/Purple62\/v4\/54\/e2\/d4\/54e2d42b-0f4e-557e-02fe-9d710c1496f8\/sc1024x768.jpeg",
        "http:\/\/a1.mzstatic.com\/us\/r30\/Purple62\/v4\/20\/ac\/4e\/20ac4e52-411c-4599-2a2a-30b44a53b516\/sc1024x768.jpeg",
        "http:\/\/a2.mzstatic.com\/us\/r30\/Purple62\/v4\/73\/ec\/92\/73ec9245-8897-1be6-4bdb-3cee460212b8\/sc1024x768.jpeg",
        "http:\/\/a5.mzstatic.com\/us\/r30\/Purple71\/v4\/76\/b6\/9d\/76b69d42-54d4-115d-9db5-8e334fff1b46\/sc1024x768.jpeg"
      ]
    }
  ]
}
->->->->->->->->->->Response->->->->->->->->->xxxxxxxxxx requestMyServers(urlRequest: URLRequest(url: URL(string: "http://itunes.apple.com/US/lookup?id=414478124")!))?.responseMyServers(completionHandler: { (_) in})

CGRect

var frame = CGRect(x: 10, y: 20, width: 30, height: 40)
print(frame.omX) // 10.0
frame.omX = 50
print(frame.omX) // 50.0

UIAlertController

let alertController = UIAlertController(title: "title", message: "message", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "ok", style: .default, handler: nil))
alertController.om.show()

UIApplaction

获取应用名称

print(UIApplication.OM.appName) // OMExtensionDemo

获取应用外部版本号

print(UIApplication.OM.appVersion) // 1.0

获取应用内部版本号

print(UIApplication.OM.appBuild) // 1

获取应用唯一标识

print(UIApplication.OM.appIdentifier) // com.octmon.OMExtensionDemo

获取应用名称delegate

print(UIApplication.OM.appDelegate) // <OMExtensionDemo.AppDelegate: 0x7fdba3513720>

获取当前UIViewController

UIApplication.OM.currentVC

获取当前UINavigationController

UIApplication.OM.currentNC

获取当前UITabBarController

UIApplication.OM.currentTBC

手机震动

UIApplication.OM.playVibrate()

手机播放系统声音

UIApplication.OM.playSystemSound(systemSoundID: .alarm)

手机播放自定义声音

UIApplication.OM.playSound(forResource: "noticeMusic.caf")

是否可以打开URL (判断手机是否安装微信 需要在“Info.plist”中将要使用的URL Schemes列为白名单)

UIApplication.OM.canOpenURL(string: "weixin://")

在浏览器中打开URL (跳转微信 需要在“Info.plist”中将要使用的URL Schemes列为白名单)

UIApplication.OM.openURL(string: "weixin://")

打电话

UIApplication.OM.call(telephone: "112")

跳转到appStore应用详情

UIApplication.OM.openAppStoreDetails(id: 414478124)

跳转到appStore应用评价

UIApplication.OM.openAppStoreReviews(id: 414478124)

应用在appStore中的下载地址

UIApplication.OM.getAppStoreURL(id: 414478124)

应用在appStore中的详情json的请求地址

UIApplication.OM.getAppStoreLookupURL(id: 414478124)

跳转到系统设置

UIApplication.OM.openAppSettings() // 跳转到应用设置
UIApplication.OM.openPrefsAbout() // 跳转到关于本机
UIApplication.OM.openPrefsAccessibility() // 跳转到辅助功能
UIApplication.OM.openPrefsAirplane() // 跳转到飞行模式
UIApplication.OM.openPrefsAutoLock() // 跳转到自动锁定
UIApplication.OM.openPrefsDateTime() // 跳转到日期与时间
UIApplication.OM.openPrefsFaceTime() // 跳转到FaceTime
UIApplication.OM.openPrefsGeneral() // 跳转到通用
UIApplication.OM.openPrefsKeyboard() // 跳转到键盘
UIApplication.OM.openPrefsiCloud() // 跳转到iCloud
UIApplication.OM.openPrefsiCloudStorageBackup() // 跳转到iCloud储存空间
UIApplication.OM.openPrefsInternational() // 跳转到语言与地区
UIApplication.OM.openPrefsLocationServices() // 跳转到定位服务
UIApplication.OM.openPrefsMusic() // 跳转到音乐
UIApplication.OM.openPrefsNotes() // 跳转到备忘录
UIApplication.OM.openPrefsNotification() // 跳转到通知
UIApplication.OM.openPrefsPhone() // 跳转到电话
UIApplication.OM.openPrefsPhotos() // 跳转到照片与相机
UIApplication.OM.openPrefsProfile() // 跳转到描述文件
UIApplication.OM.openPrefsReset() // 跳转到还原
UIApplication.OM.openPrefsRingtone() // 跳转到电话铃声
UIApplication.OM.openPrefsSounds() // 跳转到声音
UIApplication.OM.openPrefsSoftwareUpdate() // 跳转到软件更新
UIApplication.OM.openPrefsStore() // 跳转到iTunes Store 与 App Store
UIApplication.OM.openPrefsTwitter() // 跳转到Twitter
UIApplication.OM.openPrefsVideo() // 跳转到视频
UIApplication.OM.openPrefsWallpaper() // 跳转到墙纸
UIApplication.OM.openPrefsWiFi() // 跳转到Wi-Fi

TouchID授权

UIApplication.OM.authenticationTouchID(reason: "TouchID授权测试", handler: { (success, error) -> Void in
    
    print(error ?? "授权成功")
})

动态切换主机地址

Active Compilation Conditions自定义环境变量

/// 配置release

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
    #if DEBUG
        let isDebug = true
    #else
        let isDebug = false
    #endif
    
    #if APPSTORE
        let isAppstore = true
    #else
        let isAppstore = false
    #endif
    
    #if BETA
        let isBeta = true
    #else
        let isBeta = false
    #endif
    
    UIApplication.OM.release.isDebug = isDebug
    UIApplication.OM.release.isAppstore = isAppstore
    UIApplication.OM.release.isBeta = isBeta
    
    UIApplication.OM.release.configURLRelease = "http://release.example.com"
    UIApplication.OM.release.configURLDeveloper = "http://developer.example.com"
    UIApplication.OM.release.configURLTest = "http://test.example.com"
    
    // Override point for customization after application launch.
    return true
}

/// 弹出切换对话框
if !UIApplication.OM.release.isAppstore {
    
    tableView.tableHeaderView?.om.addLongPressGestureRecognizer(handler: { [unowned self] (longPressGestureRecognizer) in
        
        if longPressGestureRecognizer.state == .ended {
            
            UIApplication.OM.release.showBaseURL(viewController: self,  completionHandler: { (type) in
                
                print("Switch success: " + type.rawValue)
                
                // 请求接口时使用 UIApplication.OM.release.baseURL.currentURL
                print("Current URL: " + UIApplication.OM.release.baseURL.currentURL)
            })
        }
    })
}

UIBarButtonItem

点击回调

barButtonItem.om.clickHandler {

    print("点击回调")
}

UIButton

点击回调

button.om.addTapGestureRecognizer { [unowned self] (tapGestureRecognizer) in
    // 回调
}

开始菊花动画

button.om.startActivity()

停止菊花动画

button.om.stopActivity()

UIColor

创建颜色

print(UIColor(omHex: 0x123456)) // UIDeviceRGBColorSpace 0.0705882 0.203922 0.337255 1
print(UIColor(omHex: 0x666666, alpha: 0.5)) // UIDeviceRGBColorSpace 0.4 0.4 0.4 0.5
print(UIColor(omHex: "#00E079")) // UIDeviceRGBColorSpace 0 0.878431 0.47451 1
print(UIColor(omR: 128, G: 128, B: 128)) // UIDeviceRGBColorSpace 0.501961 0.501961 0.501961 1
print(UIColor(omR: 128, G: 128, B: 128, a: 0.5)) // UIDeviceRGBColorSpace 0.501961 0.501961 0.501961 0.5

let color = UIColor(omHex: 0x00E079)
print(color.om.red) // 0
print(color.om.green) // 224
print(color.om.blue) // 121
print(color.om.alpha) // 1.0
print(color.om.isLight) // true

[中国传统色彩](CHINESE TRADITIONAL COLOR.md)

UIDevice

设备型号

print(UIDevice.OM.name) // x86_64

iPad判断

print(UIDevice.OM.isPad) // false

iPhone判断

print(UIDevice.OM.isPhone) // true

前面的摄像头是否可用

print(UIDevice.OM.isAvailableCameraFront) // false

后面的摄像头是否可用

print(UIDevice.OM.isAvailableCameraRear) // false

UIFont

print(UIFont(omFontName: .helveticaNeueUltraLight, size: UIFont.preferredFontForTextStyle(UIFontTextStyleSubheadline).pointSize)) // Optional(<UICTFont: 0x7fcc21e214d0> font-family: "HelveticaNeue-UltraLight"; font-weight: normal; font-style: normal; font-size: 15.00pt)

print(UIFont.fontNamesForFamilyName(OMFamilyFontName.arial.rawValue)) // ["ArialMT", "Arial-BoldItalicMT", "Arial-BoldMT", "Arial-ItalicMT"]

UIImage

创建二维码

print(UIImage(omColor: UIColor.red, frame: CGRect(x: 0, y: 0, width: 100, height: 100)) ?? "") // Optional(<UIImage: 0x7fcadb5ac110>, {100, 100})

print(UIImage(omBarcode: "123456789") ?? "") // Optional(<UIImage: 0x7ff25064c480>, {115, 46})

创建条形码

print(UIImage(omQRcode: "https://github.com/OctMon")) // Optional(<UIImage: 0x7ff250648b20>, {27, 27})

改变尺寸

var image = UIImage(omQRcode: "https://github.com/OctMon")
print(image ?? "")

image =  image?.om.resize(size: CGSize(width: 300, height: 300))
print(image ?? "")

获取应用启动图

UIImage.OM.launchImage

UINavigationBar

隐藏导航阴影并透明

omNavigationBar?.om.setTransparent(transparent: true)

隐藏导航阴影不透明

omNavigationBar?.om.setTransparent(transparent: true, translucent: false)

UINavigationItem

开始菊花动画

self?.navigationItem.om.startActivity(position: .right)

停止菊花动画

self?.navigationItem.om.stopActivity()

UIScreen

竖屏判断

print(UIScreen.OM.isPortrait) // true

frame

print(UIScreen.OM.bounds) // (0.0, 0.0, 414.0, 736.0)
print(UIScreen.OM.size) // (414.0, 736.0)
print(UIScreen.OM.width) // 414.0
print(UIScreen.OM.height) // 736.0

UIStoryboard

通过Storyboard初始化一个UIViewController

UIStoryboard(omName: "Storyboard 文件名").instantiateViewController(withIdentifier: "Storyboard ID")

UITableView

波浪动画

tableView.om.reloadAnimationWave()

设置tableHeaderView、tableFooterView高度

tableView.om.setHeaderZero()
tableView.om.setFooterZero()

获取最后一组、一行

self.tableView.om.lastSection
self.tableView.om.lastRow(inSection: 1)

滚动到顶部、底部

self.tableView.om.scrollToTop()
self.tableView.om.scrollToBottom()

UITextField

限制长度

textField.om.addTextLimit(length: 3) {
    print("超出限制")
}

键盘右上角添加完成按钮收回键盘

textField.om.addDoneButton(barStyle: .default, title: "完成")

文本添加左边距

textField.om.addLeftSpace(padding: 50)

文本添加图标

textField.om.addLeftIcon(image: UIImage(named: "icon")!)

设置PlaceholderColor

textField.om.setPlaceholderColor(UIColor.green)

UITextView

限制长度

textView.om.addTextLimit(length: 11)

键盘右上角添加完成按钮收回键盘

textView.om.addDoneButton(barStyle: .default, title: "完成")

UIView

gestureRecognizer

view.om.addTapGestureRecognizer { [unowned self] (tapGestureRecognizer) in
    
    print(self.om.className + "点按手势回调")
}
view.om.addLongPressGestureRecognizer { [unowned self] (longPressGestureRecognizer) in
    
    print(self.om.className + "长按手势回调")
}
view.om.addPinchGestureRecognizer { [unowned self] (pinchGestureRecognizer) in
    
    print(self.om.className + "捏合手势回调")
}
view.om.addSwipeGestureRecognizer(.left) { [unowned self] (swipeGestureRecognizer) in
    
    print(self.om.className + "轻扫手势回调")
}
view.om.addPanGestureRecognizer { [unowned self] (panGestureRecognizer) in
    
    print(self.om.className + "拖动手势回调")
}

frame

var view = UIView(omX: 15, y: 30, width: 100, height: 150)
print(view.om.x) // 15.0
print(view.om.y) // 30.0
print(view.om.width) // 100.0
print(view.om.height) // 150.0
view.om.x = 50
print(view.om.x) // 50.0
let view = UIView(omX: 10, y: 20, width: 100, height: 200)
print(view.om.top) // 20.0
print(view.om.bottom) // 220.0
print(view.om.left) // 10.0
print(view.om.right) // 110.0
print(view.om.centerX) // 60.0
print(view.om.centerY) // 120.0
print(view.om.origin) // (10.0, 20.0)
print(view.om.size) // (100.0, 200.0)
let view1 = UIView(omX: 0, y: 0, width: 100, height: 100)
let view2 = UIView(omX: view1.om.rightOffset(15.0), y: view1.om.bottomOffset(30), width: 100, height: 100)
print(view2.frame) // (115.0, 130.0, 100.0, 100.0)

layer

view.om.addBorder()
view.om.addBorderBottom(size: 0.3, color: UIColor(omHex: 0xCCCCCC), padding: (0, 0))
view.om.addRoundedCorners()
view.om.addRoundedCorners(byRoundingCorners: .allCorners, cornerRadii: 10)
tableView.om.addContentsImage(UIImage(named: "icon_icloud"), contentsGravity: kCAGravityResizeAspect)
label.om.addShadow(offset: CGSize(width: 5, height: 5), opacity: 0.7, radius: 5, color: UIColor.black)

transform

view.om.transform3DScale(x: 0.8, y: 0.8)
view.om.transform3DRotationX(30)

animation

view.om.animationShake() // 摇一摇动画
view.om.animationHeartbeat(1) // 心跳动画
view.om.animationPulse(1) // 脉冲动画

screenshot

view.om.savedScreenshotPhotosAlbum() // 截图并保存到相册
view.om.getScreenshot() // 截图

颜色渐变

view.om.addGradientColors([UIColor.red, UIColor.green, UIColor.blue])

快速实例化一个xib

let test = TestView.omInstantiateFromNib() as! TestView
view.addSubview(test)

UIViewController

点击任意位置收回键盘

om.hideKeyboardwhenTapped()

收回键盘

om.hideKeyboard()

设置背景图

om.setBackgroundImage(UIImage(named: "background"))

监听截屏事件

om.addUserDidTakeScreenshotNotification {
    // 回调
}

显示占位图

om.showPlaceholder(image: image, shouldTap: true, buttonBackgroundImages: [(backgroundImageNormal, state: UIControlState()), (backgroundImageHighlight, state: UIControlState.highlighted)], buttonTitles: (backgroundImageNormal != nil ? [(title.omGetAttributes(), UIControlState())] : nil), buttonTapHandler: { (button) in
	// 按钮点击回调
}, placeholderViewTapHandler: { 
    // 占位图点击回调
})

其它

om.navigationBar
        
om.pushViewController(UIViewController(), animated: true)
om.popViewController(animated: true)
   
om.presentViewController(UIViewController(), animated: true, completion: nil)
om.dismissViewController()
   
om.setBackBarButtonItem(title: "返回") // 设置返回按钮的文字

###UIWebView

清理Cookies

webView.om.clearCookies()