Cambiar el marco de CALayer de UIView (self.view.layer.frame = …) parece no tener ningún efecto

Estoy seguro de que me estoy perdiendo algo básico aquí. Estoy probando el código hello world de CALayers de:

http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Haciendo el primer ejemplo. Nuevo proyecto de vista única en xcode 4.2. No hay cambio en la punta de testing / storyboard. Importar QuartzCore. Agregue el siguiente código a ViewDidLoad en ViewController.m:

- (void)viewDidLoad { [super viewDidLoad]; self.view.layer.backgroundColor = [UIColor blueColor].CGColor; self.view.layer.cornerRadius = 30.0; self.view.layer.frame = CGRectMake(20, 20, 20, 20); } 

Ejecuté esto (ipad 2 o ipad simulator) y obtuve un rectángulo azul de pantalla completa con esquinas networkingondeadas. Lo que esperaba conseguir era un rectángulo azul 20×20 compensado por 20/20.

Estoy obteniendo claramente el control sobre la capa de vistas (como lo muestran el color y las esquinas networkingondeadas). Sin embargo, el ajuste del marco parece no tener impacto. He NSLog'ed el marco antes / después de configurarlo, y ha cambiado. ¿El marco de la capa raíz está bloqueado en el marco de uiview?

No tengo una razón poderosa para cambiar el marco de las capas de vistas, solo estoy tratando de explicar lo que está sucediendo. Espero que esta sea una pregunta fácil …

¡Gracias!

Pablo

En realidad, la respuesta anterior (no puedes configurar uiview.layer.frame, ya que siempre llena la uiview) está cerca, pero no es del todo completa. Después de leer la respuesta, me registré para el sitio original y comento que el tutorial tenía problemas. Al hacerlo, descubrí que ya había comentarios que no había visto en mi primer pase que abordaron esto. Usando esos, comencé a hacer algunas testings.

La línea inferior, si mueve el código de configuration self.view.layer.frame de viewDidLoad para ver WillAppear, funciona bien. Eso significa que puede cambiar el marco de la capa raíz de una vista. Sin embargo, si lo hace en viewDidLoad, se deshará más tarde.

Sin embargo, la respuesta anterior sigue siendo bastante estrecha. I NSLog "el marco de la capa raíz y el marco de la vista. Cambiar el marco de la capa raíz cambia el marco de la vista. Entonces, la respuesta de que view.layer.frame siempre llena el view.frame es correcta. Sin embargo, al establecer el marco de capa se restablece el marco de vista para que coincida. (Supongo que la propiedad uiview.frame simplemente devuelve uiview.layer.frame …)

Entonces, en algún momento entre 2010 y hoy, algo en el entorno cambió. Específicamente, después de viewDidLoad y before viewWillAppear, el marco de vista / capa parece restablecerse al valor especificado de la punta. Esto anula cualquier cambio en viewDidLoad. Los cambios realizados en viewWillAppear parecen adherirse.

La respuesta de Robin me llevó por el buen path, pero quería explicar la respuesta completa.

El tutorial es incorrecto. Establecer el marco de la capa principal de la vista no tiene efecto. La capa principal es 'especial' y siempre llenará los límites de la vista. Lo que debe hacer es crear una subcapa de la capa principal como esta:

 - (void)viewDidLoad { [super viewDidLoad]; CALayer *newLayer = [[CALayer alloc] init]; newLayer.backgroundColor = [UIColor orangeColor].CGColor; newLayer.cornerRadius = 20.0; newLayer.frame = CGRectMake(100.0f, 100.0f, 200.0f, 200.0f); [self.view.layer addSublayer:newLayer]; [newLayer release]; // Assuming you're not using ARC } 

Además, en su código, una capa con un ancho de 20pt y alto de 20pt es demasiado pequeña como para tener esquinas networkingondeadas de 30pt de todos modos.