Muy buenas, soy Luis y en esta ocasión les traigo este artículo.
🏁 Aquí vamos:
Índice
1. Relleno de un botón UIB
A menudo me encuentro teniendo que agregar algo de relleno a un UIButton
. En lugar de retocar con el titleEdgesInsets
y contentEdgeInsets
, Creé esta simple extensión CGSize
, que luego uso en subclases UIButton
:
extension CGSize { func addingPadding(width: CGFloat, height: CGFloat) -> CGSize { CGSize(width: self.width + width, height: self.height + height) } } // Usage: class PaddedButton: UIButton { override var intrinsicContentSize: CGSize { super.intrinsicContentSize.addingPadding(width: 60, height: 20) } }
2. Resaltar partes de una cadena
Es común implementar algún tipo de resaltado de cadena parcial al agregar autocompletar a una aplicación. Para ahorrarme algo de tiempo, utilizo la siguiente extensión. El ejemplo demuestra el uso con un UILabel
.
extension NSAttributedString { func highlighting(_ substring: String, using color: UIColor) -> NSAttributedString { let attributedString = NSMutableAttributedString(attributedString: self) attributedString.addAttribute(.foregroundColor, value: color, range: (self.string as NSString).range(of: substring)) return attributedString } } // Usage: label.attributedText = NSAttributedString(string: "Budapest") label.attributedText = label.attributedText?.highlighting("Bud", using: .blue)
3. Matriz de subíndices mediante IndexPath
¿Alguna vez ha escrito algo como esto en su tableView (_: cellForRowAt :)
¿implementación?
cell.item = items[indexPath.row]
Vincular datos a sus celdas utilizando la ruta del índice de la fila como subíndice de la matriz es una práctica común. Casi escribo esta línea de código (o algo muy similar) todos los días y, a veces, todavía me olvido de agregar .fila
a la ruta del índice.
Para ahorrarme 0,15
segundos cada vez, extendido
el valor por defecto Matriz veloz
con esta sencilla función:
extension Array { subscript(indexPath: IndexPath) -> Element { self[indexPath.row] } }
4. Encontrar supervistas con un tipo determinado
¿Alguna vez ha querido acceder a su celda de vista de tabla desde un campo de texto que está incrustado en esa celda? ¿Quizás acceder a la vista de colección desde una subclase de celda de vista de colección?
Te tengo cubierto:
extensión UIView { func superview <T> (de tipo: T.Type) -> T? { devolver supervista como? T ?? superview.flatMap {$ 0.superview (of: type)} } } // Ejemplo de uso: func textFieldDidBeginEditing (_ textField: UITextField) { // Obtiene la celda que contiene el campo de texto. if let cell = textField.superview (of: TextFieldTableViewCell.self) { cell.toggle (está resaltado: verdadero) } }
5. Incrustación de un controlador de vista dentro de otro controlador de vista, también conocido como vistas de contenedor
Un problema importante con MVC
de Apple enfoque radica en su nombre. ¡Son controladores de vista masivos! Elegir una arquitectura es en realidad un tema muy debatido entre los desarrolladores de iOS.
Está completamente bien seguir con MVC
patrón, siempre y cuando aplique el principio de responsabilidad única y use vistas de contenedor dentro de sus controladores de vista.
Esto asegura que un controlador de vista solo tenga un trabajo y mantiene su implementación bastante simple.
Un beneficio adicional es que puede reutilizar sus controladores de vista muy fácilmente, y las IU
complejas se vuelven bastante manejables, ya que están construidas a partir de componentes de IU
compactos que administran su propio estado.
La extensión que uso para incrustar controladores de vista:
extensión UIViewController { func embed (_ vc: UIViewController, en _containerView: UIView? = nil) { dejar containerView: UIView = _containerView ?? view // Usa la vista completa si no se proporciona una vista de contenedor. containerView.addSubview (vc.view) NSLayoutConstraint.activate ([ vc.view.leadingAnchor.constraint (equalTo: containerView.leadingAnchor, constante: 0), vc.view.trailingAnchor.constraint (equalTo: containerView.trailingAnchor, constante: 0), vc.view.topAnchor.constraint (equalTo: containerView.topAnchor, constante: 0), vc.view.bottomAnchor.constraint (equalTo: containerView.bottomAnchor, constante: 0) ]) vc.view.translatesAutoresizingMaskIntoConstraints = false addChild (vc) vc.didMove (toParent: self) } }
5 + 1 Gestión de colores en su aplicación
Con el lanzamiento de iOS 11, manzana introducido colores nombrados. Esto le permite organizar sus colores en Catálogos de activos, al igual que lo haría con sus imágenes, super ordenado. Un problema con esto es tener que hacer referencia UIColores
así en tu código:
UIColor(named: "Primary")
Por supuesto, esto es bastante propenso a errores (imagine tener que hacer referencia a ese color en 10
lugares diferentes en su aplicación), y sería mucho mejor aprovechar las ventajas de Swift seguridad de tipo (que también nos da autocompletar).
Podemos lograrlo fácilmente ampliando UIColor
con propiedades calculadas para nuestros colores nombrados:
extension UIColor { static var accent: UIColor { UIColor(named: "Accent")! } static var primary: UIColor { UIColor(named: "Primary")! } static var primaryText: UIColor { UIColor(named: "PrimaryText")! } }
Gracias por leer este artículo.
Añadir comentario