Создание UIView со слоем из Application Delegate - PullRequest
1 голос
/ 24 октября 2010

Начиная с приложения по умолчанию, основанного на представлении, я создаю новый вид (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), чего я не делаю в коде?

Спасибо!

PS Это упражнение в понимании того, как это работаетсцены, не использующие лучшие практики.

1 Ответ

3 голосов
/ 24 октября 2010

В awakeFromNib используйте ld.frame = self.bounds; вместо ld.frame = self.frame;.

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

...