Created
July 25, 2019 12:42
-
-
Save chaitanyaSoni96/235008fb1caf2f52cd9eebb6e570e38f to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// SharedExtensions.swift | |
// Aansim 2019 | |
// | |
// Created by chaitanyaSoni on 7/19/19. | |
// Copyright © 2019 Creative Plus. All rights reserved. | |
// | |
import Foundation | |
//MARK:- UIColor Extensions - | |
//UIColor from hex code and alpha value eg-#ffffff99 | |
extension UIColor { | |
public convenience init?(hex: String) { | |
let r, g, b, a: CGFloat | |
if hex.hasPrefix("#") { | |
let start = hex.index(hex.startIndex, offsetBy: 1) | |
let hexColor = String(hex[start...]) | |
if hexColor.count == 8 { | |
let scanner = Scanner(string: hexColor) | |
var hexNumber: UInt64 = 0 | |
if scanner.scanHexInt64(&hexNumber) { | |
r = CGFloat((hexNumber & 0xff000000) >> 24) / 255 | |
g = CGFloat((hexNumber & 0x00ff0000) >> 16) / 255 | |
b = CGFloat((hexNumber & 0x0000ff00) >> 8) / 255 | |
a = CGFloat(hexNumber & 0x000000ff) / 255 | |
self.init(red: r, green: g, blue: b, alpha: a) | |
return | |
} | |
} | |
} | |
return nil | |
} | |
} | |
//MARK: - UIView Extensions - | |
//automatically make view as circle | |
extension UIView { | |
func asCircle() { | |
self.layer.cornerRadius = self.frame.width / 2; | |
self.layer.masksToBounds = true | |
} | |
} | |
//MARK:- String Extensions - | |
//Check if string is empty | |
protocol OptionalString {} | |
extension String: OptionalString {} | |
extension Optional where Wrapped: OptionalString { | |
var isNilOrEmpty: Bool { | |
return ((self as? String) ?? "").isEmpty | |
} | |
} | |
//Check if string is a valid email | |
extension String { | |
func isValidEmail() -> Bool { | |
// here, `try!` will always succeed because the pattern is valid | |
let regex = try! NSRegularExpression(pattern: "^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$", options: .caseInsensitive) | |
return regex.firstMatch(in: self, options: [], range: NSRange(location: 0, length: count)) != nil | |
} | |
} | |
//HTML text to attributed text | |
extension String { | |
var utfData: Data { | |
return Data(utf8) | |
} | |
var attributedHtmlString: NSAttributedString? { | |
do { | |
return try NSAttributedString(data: utfData, | |
options: [ | |
.documentType: NSAttributedString.DocumentType.html, | |
.characterEncoding: String.Encoding.utf8.rawValue | |
], documentAttributes: nil) | |
} catch { | |
print("Error:", error) | |
return nil | |
} | |
} | |
} | |
extension UILabel { | |
func setAttributedHtmlText(_ html: String) { | |
if let attributedText = html.attributedHtmlString { | |
self.attributedText = attributedText | |
} | |
} | |
} | |
//get height/width for a uiview object for string and height/width of the object you will apply the string to | |
extension String { | |
func height(withConstrainedWidth width: CGFloat, font: UIFont) -> CGFloat { | |
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) | |
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil) | |
return ceil(boundingBox.height) | |
} | |
func width(withConstrainedHeight height: CGFloat, font: UIFont) -> CGFloat { | |
let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height) | |
let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, attributes: [.font: font], context: nil) | |
return ceil(boundingBox.width) | |
} | |
} | |
//MARK:- NSAtrributedString Extensions - | |
//get height/width for a uiview object for string and height/width of the object you will apply the attributed to | |
extension NSAttributedString { | |
func height(withConstrainedWidth width: CGFloat) -> CGFloat { | |
let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) | |
let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, context: nil) | |
return ceil(boundingBox.height) | |
} | |
func width(withConstrainedHeight height: CGFloat) -> CGFloat { | |
let constraintRect = CGSize(width: .greatestFiniteMagnitude, height: height) | |
let boundingBox = boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, context: nil) | |
return ceil(boundingBox.width) | |
} | |
} | |
//MARK: - UIImage Extensions - | |
//to resize image to a given size | |
extension UIImage { | |
func resized(to size: CGSize) -> UIImage { | |
return UIGraphicsImageRenderer(size: size).image { _ in | |
draw(in: CGRect(origin: .zero, size: size)) | |
} | |
} | |
} | |
//to create a UIImage from a UIColor | |
extension UIImage { | |
static func from(color: UIColor) -> UIImage { | |
let rect = CGRect(x: 0, y: 0, width: 1, height: 1) | |
UIGraphicsBeginImageContext(rect.size) | |
let context = UIGraphicsGetCurrentContext() | |
context!.setFillColor(color.cgColor) | |
context!.fill(rect) | |
let img = UIGraphicsGetImageFromCurrentImageContext() | |
UIGraphicsEndImageContext() | |
return img! | |
} | |
} | |
//MARK: - CAGradientLayer Extensions - | |
//create gradient from an array of UIColors | |
extension CAGradientLayer { | |
enum Point { | |
case topRight, topLeft | |
case bottomRight, bottomLeft | |
case custion(point: CGPoint) | |
var point: CGPoint { | |
switch self { | |
case .topRight: return CGPoint(x: 1, y: 0) | |
case .topLeft: return CGPoint(x: 0, y: 0) | |
case .bottomRight: return CGPoint(x: 1, y: 1) | |
case .bottomLeft: return CGPoint(x: 0, y: 1) | |
case .custion(let point): return point | |
} | |
} | |
} | |
convenience init(frame: CGRect, colors: [UIColor], startPoint: CGPoint, endPoint: CGPoint) { | |
self.init() | |
self.frame = frame | |
self.colors = colors.map { $0.cgColor } | |
self.startPoint = startPoint | |
self.endPoint = endPoint | |
} | |
convenience init(frame: CGRect, colors: [UIColor], startPoint: Point, endPoint: Point) { | |
self.init(frame: frame, colors: colors, startPoint: startPoint.point, endPoint: endPoint.point) | |
} | |
func createGradientImage() -> UIImage? { | |
defer { UIGraphicsEndImageContext() } | |
UIGraphicsBeginImageContext(bounds.size) | |
guard let context = UIGraphicsGetCurrentContext() else { return nil } | |
render(in: context) | |
return UIGraphicsGetImageFromCurrentImageContext() | |
} | |
} | |
//MARK: - UINavigationBar Extensions | |
//set gradient to uinavigationbar | |
extension UINavigationBar { | |
func setGradientBackground(colors: [UIColor], startPoint: CAGradientLayer.Point = .topLeft, endPoint: CAGradientLayer.Point = .bottomLeft) { | |
var updatedFrame = bounds | |
updatedFrame.size.height += self.frame.origin.y | |
let gradientLayer = CAGradientLayer(frame: updatedFrame, colors: colors, startPoint: startPoint, endPoint: endPoint) | |
setBackgroundImage(gradientLayer.createGradientImage(), for: UIBarMetrics.default) | |
} | |
} | |
extension UINavigationBar | |
{ | |
/// Applies a background gradient with the given colors | |
func apply(gradient colors : [UIColor]) { | |
var frameAndStatusBar: CGRect = self.bounds | |
frameAndStatusBar.size.height += 20 // add 20 to account for the status bar | |
setBackgroundImage(UINavigationBar.gradient(size: frameAndStatusBar.size, colors: colors), for: .default) | |
} | |
/// Creates a gradient image with the given settings | |
static func gradient(size : CGSize, colors : [UIColor]) -> UIImage? | |
{ | |
// Turn the colors into CGColors | |
let cgcolors = colors.map { $0.cgColor } | |
// Begin the graphics context | |
UIGraphicsBeginImageContextWithOptions(size, true, 0.0) | |
// If no context was retrieved, then it failed | |
guard let context = UIGraphicsGetCurrentContext() else { return nil } | |
// From now on, the context gets ended if any return happens | |
defer { UIGraphicsEndImageContext() } | |
// Create the Coregraphics gradient | |
var locations : [CGFloat] = [0.0, 1.0] | |
guard let gradient = CGGradient(colorsSpace: CGColorSpaceCreateDeviceRGB(), colors: cgcolors as NSArray as CFArray, locations: &locations) else { return nil } | |
// Draw the gradient | |
context.drawLinearGradient(gradient, start: CGPoint(x: 0.0, y: 0.0), end: CGPoint(x: size.width, y: 0.0), options: []) | |
// Generate the image (the defer takes care of closing the context) | |
return UIGraphicsGetImageFromCurrentImageContext() | |
} | |
} | |
//MARK: - UIView Extensions - | |
extension UIView { | |
/// Remove allSubView in view | |
func removeAllSubViews() { | |
self.subviews.forEach({ $0.removeFromSuperview() }) | |
} | |
} | |
//MARK: - UIViewController Extensions - | |
extension UIViewController { | |
//Show a basic alert | |
func showBasicAlert(alertMessage : String) { | |
let alert = UIAlertController(title: alertTitle, message: alertMessage, preferredStyle: UIAlertController.Style.alert) | |
alert.addAction(UIAlertAction(title: "OK", style: UIAlertAction.Style.default, handler: nil)) | |
//Add more actions as you see fit | |
self.present(alert, animated: true, completion: nil) | |
} | |
} | |
//MARK:- Get Device Type Extentions - | |
public enum Model : String { | |
case simulator = "simulator/sandbox", | |
iPod1 = "iPod 1", | |
iPod2 = "iPod 2", | |
iPod3 = "iPod 3", | |
iPod4 = "iPod 4", | |
iPod5 = "iPod 5", | |
iPad2 = "iPad 2", | |
iPad3 = "iPad 3", | |
iPad4 = "iPad 4", | |
iPhone4 = "iPhone 4", | |
iPhone4S = "iPhone 4S", | |
iPhone5 = "iPhone 5", | |
iPhone5S = "iPhone 5S", | |
iPhone5C = "iPhone 5C", | |
iPadMini1 = "iPad Mini 1", | |
iPadMini2 = "iPad Mini 2", | |
iPadMini3 = "iPad Mini 3", | |
iPadAir1 = "iPad Air 1", | |
iPadAir2 = "iPad Air 2", | |
iPadPro9_7 = "iPad Pro 9.7\"", | |
iPadPro9_7_cell = "iPad Pro 9.7\" cellular", | |
iPadPro10_5 = "iPad Pro 10.5\"", | |
iPadPro10_5_cell = "iPad Pro 10.5\" cellular", | |
iPadPro12_9 = "iPad Pro 12.9\"", | |
iPadPro12_9_cell = "iPad Pro 12.9\" cellular", | |
iPhone6 = "iPhone 6", | |
iPhone6plus = "iPhone 6 Plus", | |
iPhone6S = "iPhone 6S", | |
iPhone6Splus = "iPhone 6S Plus", | |
iPhoneSE = "iPhone SE", | |
iPhone7 = "iPhone 7", | |
iPhone7plus = "iPhone 7 Plus", | |
iPhone8 = "iPhone 8", | |
iPhone8plus = "iPhone 8 Plus", | |
iPhoneX = "iPhone X", | |
iPhoneXS = "iPhone XS", | |
iPhoneXSmax = "iPhone XS Max", | |
iPhoneXR = "iPhone XR", | |
unrecognized = "?unrecognized?" | |
} | |
public extension UIDevice { | |
var type: Model { | |
var systemInfo = utsname() | |
uname(&systemInfo) | |
let modelCode = withUnsafePointer(to: &systemInfo.machine) { | |
$0.withMemoryRebound(to: CChar.self, capacity: 1) { | |
ptr in String.init(validatingUTF8: ptr) | |
} | |
} | |
var modelMap : [ String : Model ] = [ | |
"i386" : .simulator, | |
"x86_64" : .simulator, | |
"iPod1,1" : .iPod1, | |
"iPod2,1" : .iPod2, | |
"iPod3,1" : .iPod3, | |
"iPod4,1" : .iPod4, | |
"iPod5,1" : .iPod5, | |
"iPad2,1" : .iPad2, | |
"iPad2,2" : .iPad2, | |
"iPad2,3" : .iPad2, | |
"iPad2,4" : .iPad2, | |
"iPad2,5" : .iPadMini1, | |
"iPad2,6" : .iPadMini1, | |
"iPad2,7" : .iPadMini1, | |
"iPhone3,1" : .iPhone4, | |
"iPhone3,2" : .iPhone4, | |
"iPhone3,3" : .iPhone4, | |
"iPhone4,1" : .iPhone4S, | |
"iPhone5,1" : .iPhone5, | |
"iPhone5,2" : .iPhone5, | |
"iPhone5,3" : .iPhone5C, | |
"iPhone5,4" : .iPhone5C, | |
"iPad3,1" : .iPad3, | |
"iPad3,2" : .iPad3, | |
"iPad3,3" : .iPad3, | |
"iPad3,4" : .iPad4, | |
"iPad3,5" : .iPad4, | |
"iPad3,6" : .iPad4, | |
"iPhone6,1" : .iPhone5S, | |
"iPhone6,2" : .iPhone5S, | |
"iPad4,1" : .iPadAir1, | |
"iPad4,2" : .iPadAir2, | |
"iPad4,4" : .iPadMini2, | |
"iPad4,5" : .iPadMini2, | |
"iPad4,6" : .iPadMini2, | |
"iPad4,7" : .iPadMini3, | |
"iPad4,8" : .iPadMini3, | |
"iPad4,9" : .iPadMini3, | |
"iPad6,3" : .iPadPro9_7, | |
"iPad6,11" : .iPadPro9_7, | |
"iPad6,4" : .iPadPro9_7_cell, | |
"iPad6,12" : .iPadPro9_7_cell, | |
"iPad6,7" : .iPadPro12_9, | |
"iPad6,8" : .iPadPro12_9_cell, | |
"iPad7,3" : .iPadPro10_5, | |
"iPad7,4" : .iPadPro10_5_cell, | |
"iPhone7,1" : .iPhone6plus, | |
"iPhone7,2" : .iPhone6, | |
"iPhone8,1" : .iPhone6S, | |
"iPhone8,2" : .iPhone6Splus, | |
"iPhone8,4" : .iPhoneSE, | |
"iPhone9,1" : .iPhone7, | |
"iPhone9,2" : .iPhone7plus, | |
"iPhone9,3" : .iPhone7, | |
"iPhone9,4" : .iPhone7plus, | |
"iPhone10,1" : .iPhone8, | |
"iPhone10,2" : .iPhone8plus, | |
"iPhone10,3" : .iPhoneX, | |
"iPhone10,6" : .iPhoneX, | |
"iPhone11,2" : .iPhoneXS, | |
"iPhone11,4" : .iPhoneXSmax, | |
"iPhone11,6" : .iPhoneXSmax, | |
"iPhone11,8" : .iPhoneXR | |
] | |
if let model = modelMap[String.init(validatingUTF8: modelCode!)!] { | |
return model | |
} | |
return Model.unrecognized | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment