iphone - framework - Relación entre UIVIew y CALayer con respecto a la imagen de fondo en iOS
uikit ios (1)
UIView como creado opaco por defecto. Cuando establece backgroundColor en un patrón con transparencia, elige negro como color de fondo. Puede establecer
customViewController.view.opaque = NO;
para permitir que se vea el fondo de la vista detrás de la tuya.Cuando establece backgroundColor de la capa en un patrón con transparencia, está omitiendo la lógica de UIView, por lo que se ignora la opacidad de la vista; también lo es la transformación de UIView. CoreGraphics y sus amigos usan un sistema de coordenadas donde el eje y positivo apunta hacia arriba. UIKit voltea este sistema de coordenadas. Esta es la razón por la cual la imagen aparece al revés.
Si agrega etiquetas / vistas / botones / etc. el aparecerá correctamente en la parte superior del patrón de fondo de la capa.
Cuando configura el color de fondo de la vista, aparece como si el color de fondo de la capa estuviera realmente configurado. (No he visto esto documentado en ninguna parte).
Esencialmente, el material UIView de UIKit es una interfaz de alto nivel que termina en capas.
Espero que esto ayude.
EDITAR 5/7/2011
Puede hacer que la imagen muestre el camino correcto volteando el sistema de coordenadas de la capa, PERO no debería hacer esto para ver .layer; UIKit no espera que te metas con esta capa, por lo que si cambias el sistema de coordenadas, se invertirá cualquier dibujo de UIKit; necesitas usar una subcapa.
Entonces su código se vería así:
- (void)viewDidLoad
{
[super viewDidLoad];
customViewController = [[CustomViewController alloc] init];
customViewController.view.frame = CGRectMake(213, 300, 355, 315);
CALayer* l = [CALayer layer];
l.frame = customViewController.bounds;
CGAffineTransform t = CGAffineTransformMake(1.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f);
l.affineTransform = t;
l.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage
imageNamed:@"login_background.png"]].CGColor;
[customViewController.view.layer addSublayer:l];
[self.view addSubview:customViewController.view];
}
Nota: normalmente cuando giras coordenadas, incluyes la altura. Para capas, no necesitas hacer esto. No he profundizado en por qué esto es así.
Como puede ver, hay mucho más código involucrado aquí y no hay una ventaja real para hacerlo de esta manera. Realmente recomiendo que te apegues al enfoque de UIKit. Solo publiqué el código en respuesta a tu curiosidad.
Intentando entender la relación entre UIView y CALayer. Leí la documentación de Apple, pero no describe en detalle la relación entre los dos.
¿Por qué es que cuando agrego la imagen de fondo para ver "customViewController.view", obtengo el color negro no deseado de la imagen.
Y cuando agrego la imagen de fondo a la capa "customViewController.view.layer", el área negra de la imagen se va (que es lo que quería), pero la imagen de fondo se voltea al revés. ¿Porqué es eso?
Si tuviera que agregar etiquetas / vistas / botones / etc. para la vista, ¿la imagen de fondo de la capa los bloqueará porque CAlayer está respaldado por UIView?
Cuando configura el color de fondo de un UIView, ¿configura automáticamente el color de fondo de la capa asociada?
- (void)viewDidLoad { [super viewDidLoad]; customViewController = [[CustomViewController alloc] init]; customViewController.view.frame = CGRectMake(213, 300, 355, 315); customViewController.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]]; // customViewController.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]].CGColor; [self.view addSubview:customViewController.view]; }
Imagen de fondo a la vista:
- (void)viewDidLoad
{
[super viewDidLoad];
customViewController = [[CustomViewController alloc] init];
customViewController.view.frame = CGRectMake(213, 300, 355, 315);
// customViewController.view.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]];
customViewController.view.layer.backgroundColor = [[UIColor alloc] initWithPatternImage:[UIImage imageNamed:@"login_background.png"]].CGColor;
[self.view addSubview:customViewController.view];
}
Imagen de fondo en view.layer: