Así que he estado jugueteando con los elementos de la interfaz de usuario y he descubierto que muchas cosas requieren el uso del UIElement.layer para modelar el elemento sobre el UIElement en sí mismo, aunque ambos tienen muchas properties similares. ¿Cuál sería la diferencia entre usar
let button = UIButton() button.backgroundColor(color)
encima
let button = UIButton() button.layer.backgroundColor(color)
o cualquier otra propiedad que se pueda configurar en el elemento de interfaz de usuario?
Ambas establecen el color de background de la capa respaldada, establece la propiedad backgroundColor
de UIView
y llamará eventualmente al método setBackgroundColor:(CGColorRef)backgroundColor
.
Aquí hay algunos consejos, la stack de llamadas de setBackgroundColor:
:, de setBackgroundColor:
, puede ver que llama al método setBackgroundColor de KDLayer (KDLayer es subclass de CALayer).
Aquí está el código, es el código Objective-C, pero creo que es fácil de entender.
KDView
subclass UIView
@implementation KDView + (Class)layerClass { return [KDLayer class]; } @end
KDLayer
subclass CALayer
@implementation KDLayer - (void)setBackgroundColor:(CGColorRef)backgroundColor { [super setBackgroundColor:backgroundColor]; } @end
Agregue un punto de quiebre en el método setBackgroundColor: método de KDLayer y cree una instancia de KDView y modifique su propiedad backgroundColor
.
KDView *v = [KDView new]; v.backgroundColor = [UIColor networkingColor];
En realidad son los mismos, excepto por el tipo (backgroundColor de la vista es un UIColor, y la capa es un CGColor)
var b:UIButton = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 20)) b.setTitle("Normal", for: UIControlState(rawValue: UInt(0))) b.backgroundColor = UIColor(colorLiteralRed: 1.0, green: 0.0, blue: 0.0, alpha: 1.0) b.layer.backgroundColor == b.backgroundColor?.cgColor // returns "true"
Los creadores y obturadores de properties backgroundColor de UIButton solo manipulan las properties de la capa de la vista. La documentation dice que la propiedad UIView backgroundColor se agregó en iOS 2.0, por lo que antes de eso, manipular la capa era la única forma de cambiarla.