Originalmente quería saber cómo hacer algo como esto.
UIColor.myCustomGreen
para poder definir mis propios colores y usarlos en toda mi aplicación.
Había estudiado extensiones antes y pensé que probablemente podría usarlas para resolver mi problema, pero no podía recordar exactamente cómo configurar las extensiones. La búsqueda en Google en el momento de escribir este artículo para la "extensión Swift" resultó en la documentación , varios tutoriales largos y una pregunta de Stack Overflow bastante inútil .
Entonces, las respuestas están ahí, pero es necesario investigar un poco los documentos y tutoriales. Decidí escribir esta pregunta y la siguiente respuesta para agregar algunas palabras clave de búsqueda mejores a Stack Overflow y brindar un repaso rápido sobre cómo se configuran las extensiones.
Específicamente quería saber:
- ¿Dónde residen las extensiones (archivo y convención de nomenclatura)?
- ¿Cuál es la sintaxis de la extensión?
- ¿Cuáles son algunos ejemplos sencillos de uso común?
fuente
class
para definir la función pero no String?Pruebe estos nuevos métodos de extensión:
UIColor
extension UIColor{ //get new color from rgb value class func RGB(_ red:CGFloat , andGreenColor green:CGFloat, andBlueColor blue:CGFloat, withAlpha alpha:CGFloat) -> UIColor { let color = UIColor(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: alpha) return color } } //return color from comma separated string of RGB paramater convenience init(rgbString :String, alpha:CGFloat = 1.0){ let arrColor = rgbString.components(separatedBy: ",") let red:CGFloat = CGFloat(NumberFormatter().number(from: arrColor[0])!) let green:CGFloat = CGFloat(NumberFormatter().number(from: arrColor[1])!) let blue:CGFloat = CGFloat(NumberFormatter().number(from: arrColor[2])!) self.init(red: red/255.0, green: green/255.0, blue: blue/255.0, alpha: alpha) } //return color from hexadecimal value //let color2 = UIColor(rgbHexaValue: 0xFFFFFFFF) convenience init(rgbHexaValue: Int, alpha: CGFloat = 1.0) { self.init(red: CGFloat((rgbHexaValue >> 16) & 0xFF), green: CGFloat((rgbHexaValue >> 8) & 0xFF), blue: CGFloat(rgbHexaValue & 0xFF), alpha: alpha) } }
UITextField
extension UITextField{ //set cornerRadius func cornerRadius(){ self.layoutIfNeeded() self.layer.cornerRadius = self.frame.height / 2 self.clipsToBounds = true } //set bordercolor func borderColor(){ self.layer.borderColor = TEXTFIELD_BORDER_COLOR.cgColor self.layer.borderWidth = 1.0 } //set borderWidth func borderWidth(size:CGFloat){ self.layer.borderWidth = size } //check textfield is blank func blank() -> Bool{ let strTrimmed = self.text!.trim()//get trimmed string if(strTrimmed.characters.count == 0)//check textfield is nil or not ,if nil then return false { return true } return false } //set begginning space - left space func setLeftPadding(paddingValue:CGFloat) { let paddingView = UIView(frame: CGRect(x: 0, y: 0, width: paddingValue, height: self.frame.size.height)) self.leftViewMode = .always self.leftView = paddingView } //set end of space func setRightPadding(paddingValue:CGFloat){ let paddingView = UIView(frame: CGRect(x: (self.frame.size.width - paddingValue), y: 0, width: paddingValue, height: self.frame.size.height)) self.rightViewMode = .always self.rightView = paddingView } }
UIFont
extension UIFont{ // Returns a scaled version of UIFont func scaled(scaleFactor: CGFloat) -> UIFont { let newDescriptor = fontDescriptor.withSize(fontDescriptor.pointSize * scaleFactor) return UIFont(descriptor: newDescriptor, size: 0) } }
UIImage
public enum ImageFormat { case PNG case JPEG(CGFloat) } extension UIImage { //convert image to base64 string func toBase64() -> String { var imageData: NSData switch format { case .PNG: imageData = UIImagePNGRepresentation(self)! as NSData case .JPEG(let compression): imageData = UIImageJPEGRepresentation(self, compression)! as NSData } return imageData.base64EncodedString(options: .lineLength64Characters) } //convert string to image class func base64ToImage(toImage strEncodeData: String) -> UIImage { let dataDecoded = NSData(base64Encoded: strEncodeData, options: NSData.Base64DecodingOptions.ignoreUnknownCharacters)! let image = UIImage(data: dataDecoded as Data) return image! } //Function for store file/Image into local directory. If image is already on the directory then first remove it and replace new image/File on that location func storedFileIntoLocal(strImageName:String) -> String{ var strPath = "" let documentDirectory1 = NSString.init(string: String.documentDirectory()) let imageName:String = strImageName + ".png" let imagePath = documentDirectory1.appendingPathComponent(imageName) strPath = imagePath let fileManager = FileManager.default let isExist = fileManager.fileExists(atPath: String.init(imagePath)) if(isExist == true) { do { try fileManager.removeItem(atPath: imagePath as String)//removing file if exist // print("Remove success") } catch { print(error) } } let imageData:Data = UIImageJPEGRepresentation(self, 0.5)! do { try imageData.write(to: URL(fileURLWithPath: imagePath as String), options: .atomic) } catch { print(error) strPath = "Failed to cache image data to disk" return strPath } return strPath } //function for resize image func resizeImage(targetSize: CGSize) -> UIImage { let size = self.size let widthRatio = targetSize.width / self.size.width let heightRatio = targetSize.height / self.size.height // Figure out what our orientation is, and use that to form the rectangle var newSize: CGSize if(widthRatio > heightRatio) { newSize = CGSize(width: size.width * heightRatio, height: size.height * heightRatio) } else { // newSize = size newSize = CGSize(width: size.width * widthRatio, height: size.height * widthRatio) } // This is the rect that we've calculated out and this is what is actually used below let rect = CGRect(x: 0, y: 0, width: newSize.width, height: newSize.height) // Actually do the resizing to the rect using the ImageContext stuff UIGraphicsBeginImageContextWithOptions(newSize, false, 1.0) self.draw(in: rect) let newImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() return newImage! } }
Fecha
let YYYY_MM_DD_HH_MM_SS_zzzz = "yyyy-MM-dd HH:mm:ss +zzzz" let YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss" let DD_MM_YYYY = "dd-MM-yyyy" let MM_DD_YYYY = "MM-dd-yyyy" let YYYY_DD_MM = "yyyy-dd-MM" let YYYY_MM_DD_T_HH_MM_SS = "yyyy-MM-dd'T'HH:mm:ss" extension Date{ //convert string to date static func convertStringToDate(strDate:String, dateFormate strFormate:String) -> Date{ let dateFormate = DateFormatter() dateFormate.dateFormat = strFormate dateFormate.timeZone = TimeZone.init(abbreviation: "UTC") let dateResult:Date = dateFormate.date(from: strDate)! return dateResult } //Function for old date format to new format from UTC to local static func convertDateUTCToLocal(strDate:String, oldFormate strOldFormate:String, newFormate strNewFormate:String) -> String{ let dateFormatterUTC:DateFormatter = DateFormatter() dateFormatterUTC.timeZone = NSTimeZone(abbreviation: "UTC") as TimeZone!//set UTC timeZone dateFormatterUTC.dateFormat = strOldFormate //set old Format if let oldDate:Date = dateFormatterUTC.date(from: strDate) as Date?//convert date from input string { dateFormatterUTC.timeZone = NSTimeZone.local//set localtimeZone dateFormatterUTC.dateFormat = strNewFormate //make new dateformatter for output format if let strNewDate:String = dateFormatterUTC.string(from: oldDate as Date) as String?//convert dateInUTC into string and set into output { return strNewDate } return strDate } return strDate } //Convert without UTC to local static func convertDateToLocal(strDate:String, oldFormate strOldFormate:String, newFormate strNewFormate:String) -> String{ let dateFormatterUTC:DateFormatter = DateFormatter() //set local timeZone dateFormatterUTC.dateFormat = strOldFormate //set old Format if let oldDate:Date = dateFormatterUTC.date(from: strDate) as Date?//convert date from input string { dateFormatterUTC.timeZone = NSTimeZone.local dateFormatterUTC.dateFormat = strNewFormate //make new dateformatter for output format if let strNewDate = dateFormatterUTC.string(from: oldDate as Date) as String?//convert dateInUTC into string and set into output { return strNewDate } return strDate } return strDate } //Convert Date to String func convertDateToString(strDateFormate:String) -> String{ let dateFormatter = DateFormatter() dateFormatter.dateFormat = strDateFormate let strDate = dateFormatter.string(from: self) // dateFormatter = nil return strDate } //Convert local to utc static func convertLocalToUTC(strDate:String, oldFormate strOldFormate:String, newFormate strNewFormate:String) -> String{ let dateFormatterUTC:DateFormatter = DateFormatter() dateFormatterUTC.timeZone = NSTimeZone.local as TimeZone!//set UTC timeZone dateFormatterUTC.dateFormat = strOldFormate //set old Format if let oldDate:Date = dateFormatterUTC.date(from: strDate) as Date?//convert date from input string { dateFormatterUTC.timeZone = NSTimeZone.init(abbreviation: "UTC")! as TimeZone//set localtimeZone dateFormatterUTC.dateFormat = strNewFormate //make new dateformatter for output format if let strNewDate:String = dateFormatterUTC.string(from: oldDate as Date) as String?//convert dateInUTC into string and set into output { return strNewDate } return strDate } return strDate } //Comparison two date static func compare(date:Date, compareDate:Date) -> String{ var strDateMessage:String = "" let result:ComparisonResult = date.compare(compareDate) switch result { case .orderedAscending: strDateMessage = "Future Date" break case .orderedDescending: strDateMessage = "Past Date" break case .orderedSame: strDateMessage = "Same Date" break default: strDateMessage = "Error Date" break } return strDateMessage } }
Llamar a estas funciones:
let color1 = UIColor.RGB(100.0, andGreenColor: 200.0, andBlueColor: 300.0, withAlpha: 1.0) let color2 = UIColor.init(rgbHexaValue: 800000, alpha: 1.0) let color3 = UIColor.init(rgbString: ("100.0,200.0,300.0", alpha: 1.0) self.txtOutlet.cornerRadius() self.txtOutlet.borderColor() self.txtOutlet.setLeftPadding(paddingValue: 20.0) self.txtOutlet.setRightPadding(paddingValue: 20.0) let yourScaledFont = self.dependentView.font.scaled(scaleFactor: n as! CGFloat) let base64String = (image?.toBase64(format: ImageFormat.PNG))! let resultImage = UIImage.base64ToImage(toImage: base64String) let path = yourImage.storedFileIntoLocal(strImageName: "imagename")
fuente
Ejemplo de Swift 3.0:
extension UITextField { func useUnderline() { let border = CALayer() let borderWidth = CGFloat(1.0) border.borderColor = UIColor.lightGray.cgColor border.frame = CGRect(origin: CGPoint(x: 0,y :self.frame.size.height - borderWidth), size: CGSize(width: self.frame.size.width, height: self.frame.size.height)) border.borderWidth = borderWidth self.layer.addSublayer(border) self.layer.masksToBounds = true } }
fuente
Subrayar texto en
UITextField
Utilizado en función
ViewDidLoad()
firstNametext.underlined(0.5)
Extensión
extension UITextField { func underlined(_ size:Double){ let border = CALayer() let width = CGFloat(size) border.borderColor = UIColor.red.cgColor border.frame = CGRect(x: 0, y: self.frame.size.height - width, width: self.frame.size.width, height: self.frame.size.height) border.borderWidth = width self.layer.addSublayer(border) self.layer.masksToBounds = true } } }
fuente
UIColor + util.swift
import UIKit extension UIColor{ class func getCustomBlueColor() -> UIColor { return UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00) } func getNameofColour() ->String { return "myOrange" } }
Uso :
NSLog("\(UIColor.getCustomBlueColor())") let color=UIColor(red:0.043, green:0.576 ,blue:0.588 , alpha:1.00); NSLog(color.getNameofColour())
Espero que veas la diferencia. Una de Function comienza con la clase func y otra que comienza solo func . puedes usar el que más te guste.
fuente
Uno de los mejores ejemplos de inicializador de extensión y conveniencia:
extension UIActivityIndicatorView { convenience init(activityIndicatorStyle: UIActivityIndicatorViewStyle, color: UIColor, placeInTheCenterOf parentView: UIView) { self.init(activityIndicatorStyle: activityIndicatorStyle) center = parentView.center self.color = color parentView.addSubview(self) } }
Puede utilizarlo de las siguientes formas:
Inicializar activityIndicator
let activityIndicator = UIActivityIndicatorView(activityIndicatorStyle: .whiteLarge, color: .gray, placeInTheCenterOf: view)
Iniciar indicador de actividad de animación
Dejar de animar el indicador de actividad
fuente
Si desea utilizar un color con un tono determinado como el que se utiliza en los manuales de marca: Swift 4.2 + xcode 9.4.1.
extension UIColor { func withTint(tint: CGFloat)->UIColor { var tint = max(tint, 0) tint = min(tint, 1) /* Collect values of sender */ var r : CGFloat = 0 var g : CGFloat = 0 var b : CGFloat = 0 var a : CGFloat = 0 self.getRed(&r, green: &g, blue: &b, alpha: &a) /* Calculate the tint */ r = r+(1-r)*(1-tint) g = g+(1-g)*(1-tint) b = b+(1-b)*(1-tint) a = 1 return UIColor.init(red: r, green: g, blue: b, alpha: a) } }
En tu código
let redWithTint = UIColor.red.withTint(tint: 0.4)
fuente
Aquí hay un ejemplo de extensión de un efecto de animación llamativo que funciona con celdas de UITableView. Cada celda crece desde una fuente puntual hasta un tamaño normal a medida que se desplaza por UITableView. Ajuste el tiempo de la animación como desee.
Dado que cada celda aparece con un pequeño escalonamiento de tiempo mientras se desplaza, ¡el efecto se ondula muy bien! Vea este clip de 15 segundos que muestra el efecto: https://www.youtube.com/watch?v=BVeQpno56wU&feature=youtu.be
extension UITableViewCell { func growCellDuringPresentation(thisCell : UITableViewCell) { thisCell.transform = CGAffineTransform(scaleX: 0.01, y: 0.01) UIView.animate(withDuration: TimeInterval(0.35), delay: 0.0, options: UIView.AnimationOptions.allowUserInteraction, animations: { thisCell.transform = CGAffineTransform(scaleX: 1, y: 1) }, completion: nil) } }
Para usar la extensión, realice una llamada justo antes de que se devuelva la celda en cellForRowAt, como se muestra a continuación:
cell.growCellDuringPresentation(thisCell: cell) return cell
Tenga en cuenta que este mismo método funciona al devolver celdas para una vista de colección.
Aquí hay una extensión que funciona exactamente igual, excepto que rota las celdas durante la presentación:
extension UITableViewCell { func rotateCellDuringPresentation(thisCell : UITableViewCell) { thisCell.transform = CGAffineTransform(rotationAngle: .pi) UIView.animate(withDuration: TimeInterval(0.35), delay: 0.0, options: UIView.AnimationOptions.allowUserInteraction, animations: { thisCell.transform = CGAffineTransform(rotationAngle: 0) }, completion: nil) } }
Se llama de manera similar:
cell.rotateCellDuringPresentation(thisCell: cell) return cell
Aquí hay una extensión en la misma línea que traduce las celdas en la dirección X
extension UITableViewCell { func translateCellDuringPresentation(thisCell : UITableViewCell) { thisCell.layer.transform = CATransform3DMakeTranslation(-300, 0, 0) UIView.animate(withDuration: TimeInterval(0.5), delay: 0.0, options: UIView.AnimationOptions.allowUserInteraction, animations: { thisCell.layer.transform = CATransform3DMakeTranslation(0, 0, 0) }, completion: nil) } }
Se llama de manera similar:
cell.translateCellDuringPresentation(thisCell: cell) return cell
fuente