从默认的“基于视图”的应用程序开始,我创建了一个新视图(ViewToDisplay,继承自UIView的类),在此视图中我创建了一个图层(LayerToDisplay)。视图在框架的周边绘制一些东西,图层也是如此,但这次是用虚线绘制的。这是为了显示/证明该图层覆盖整个视图。
以下是ViewToDisplay.m的相关代码
- (void) awakeFromNib
{
ld = [[LayerToDisplay alloc] init];
ld.frame = self.frame;
[self.layer addSublayer:ld];
[ld setNeedsDisplay];
}
- (void)drawRect:(CGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPath(context);
CGContextSetRGBStrokeColor(context, 255/255.0, 0/255.0, 0/255.0, 1);
CGContextSetLineWidth(context, 1);
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 320, 460);
CGContextAddLineToPoint(context, 0, 460);
CGContextAddLineToPoint(context, 320, 0);
CGContextClosePath(context);
CGContextStrokePath(context);
}
和图层(LayerToDisplay.m)
- (void)drawInContext:(CGContextRef)context
{
CGContextBeginPath(context);
CGContextSetRGBStrokeColor(context, 0/255.0, 255/255.0, 0/255.0, 1);
CGContextSetLineWidth(context, 1);
CGFloat dashes[]={3,6};
CGContextSetLineDash(context, 0, dashes, 3);
CGContextMoveToPoint(context, 0, 0);
CGContextAddLineToPoint(context, 320, 460);
CGContextAddLineToPoint(context, 0, 460);
CGContextAddLineToPoint(context, 320, 0);
CGContextClosePath(context);
CGContextStrokePath(context);
}
如果我将默认的ApplicationNameViewController.xib视图更改为我的类(ViewToDisplay),它将按预期工作。如果我尝试从应用程序委托实例化该视图,则视图会正确显示,但图层会向下移动,即图层绘制的内容与视图绘制的内容不重叠。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
ViewToDisplay *vd = [[ViewToDisplay alloc] init];
// doesn't seem to matter
//[vd setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
vd.frame = [UIScreen mainScreen].applicationFrame;
// call manually so that the layer gets created
[vd awakeFromNib];
[window addSubview:vd];
//[window addSubview:viewController.view];
[window makeKeyAndVisible];
return YES;
}
所以,我试图找出用这两种方法创建/实例化视图之间的区别。自动进程(将XIB的类更改为ViewToDisplay时)执行的操作是什么?我在代码中没有这样做?
谢谢!
P.S。这是一个了解它如何在幕后工作的练习,而不是使用最佳实践。
答案 0 :(得分:3)
在awakeFromNib
中使用ld.frame = self.bounds;
代替ld.frame = self.frame;
。
要解释发生了什么 - 如果视图由视图控制器加载,则该视图的帧从点(0,0)开始。如果您使用的是UIScreen的applicationFrame,则按状态栏的大小定位。