Начиная с приложения по умолчанию «Просмотр на основе», я создаю новый вид (ViewToDisplay, класс, который наследуется от UIView), и внутри этого представления я создаю слой (LayerToDisplay). Представление рисует что-то вокруг периметра рамки, а также слой, но на этот раз с пунктирными линиями. Это должно показать/доказать, что слой охватывает весь вид.Создание UIView со слоем из приложения Делегат
Вот соответствующий код из 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. это упражнение в понимании того, как оно работает за кулисами, а не в использовании лучших практик.
Это было, и это имеет смысл. Благодарю. – pbz