UIVIEW和CALayer关于iOS背景图片的关系

试图了解UIView和CALayer之间的关系。 我读过苹果文档,但没有详细描述两者之间的关系。

  1. 为什么当我添加背景图像来查看“customViewController.view”,我得到了图像不需要的黑色。

  2. 而当我添加背景图像到图层“customViewController.view.layer”,图像的黑色区域消失(这是我想要的),但背景图像翻转颠倒。 这是为什么?

  3. 如果我要添加标签/视图/button/等。 到视图,图层的背景图像会阻止它们,因为CAlayer是由UIView支持的?

  4. 当你设置UIView的背景颜色时,它会自动设置相关图层的背景颜色?

    - (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]; } 

背景图像:

在视图中的背景

 - (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]; } 

在view.layer中的背景图像:

在图层中的背景图像

  1. UIView默认创build为不透明。 当您将backgroundColor设置为具有透明度的图案时,它将select黑色作为背景色。 你可以设置customViewController.view.opaque = NO; 让您背后的视图背景显示出来。

  2. 当您将图层的backgroundColor设置为具有透明度的图案时,您将绕过UIView逻辑,因此忽略视图的不透明度; UIView的转换也是如此。 CoreGraphics和朋友使用一个坐标系,正Y轴向上。 UIKit翻转这个坐标系。 这就是图像颠倒的原因。

  3. 如果你添加标签/视图/button/等。 将会在图层的背景图案上正确显示。

  4. 当你设置视图的背景颜色时,就好像图层的背景颜色确实被设置了一样。 (我没有看到这个文件在任何地方)。

本质上UIKit的UIView的东西是一个高层次的接口,最终渲染到图层上。

希望这可以帮助。

编辑5/7/2011

你可以通过翻转图层的坐标系使图像显示正确的方向,但是你不应该这样做view.layer; UIKit不希望你搞乱这个层,所以如果你翻转它的坐标系,任何UIKit绘图都会被翻转; 你需要使用一个子图层。

所以你的代码看起来像这样:

 - (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]; } 

注意:通常当你翻转坐标时,包括高度。 对于图层,您不需要这样做。 我还没有深究为何如此。

正如你所看到的,这里涉及到更多的代码,这样做并没有真正的优势。 我真的build议你坚持UIKit的方法。 我只是为了回应你的好奇而发布了代码。