¿Cuál es la diferencia que modifica la base de un UIObject frente a CALayer?

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).

introduzca la descripción de la imagen aquí

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.