2010-10-23 5 views
1

Начиная с приложения по умолчанию «Просмотр на основе», я создаю новый вид (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. это упражнение в понимании того, как оно работает за кулисами, а не в использовании лучших практик.

ответ

3

В awakeFromNibld.frame = self.bounds; вместо ld.frame = self.frame;.

Чтобы объяснить, что происходит - если представление загружено view-controller, этот вид имеет свой кадр, начиная с точки (0, 0). Если вы используете прикладную структуру UIScreen, которая располагается по размеру строки состояния.

+0

Это было, и это имеет смысл. Благодарю. – pbz

Смежные вопросы