Подтвердить что ты не робот

Связь между UIVIew и CALayer относительно фонового изображения на iOS

Попытка понять отношения между UIView и CALayer. Я читаю документацию Apple, но подробно не описывает отношения между ними.

  • Почему я добавляю фоновое изображение для просмотра "customViewController.view", я получаю нежелательный черный цвет изображения.

  • И когда я добавляю фоновое изображение на слой "customViewController.view.layer", черная область изображения исчезает (это то, что я хотел), но фоновое изображение перевернуто вверх дном. Почему это?

  • Если бы я добавил метки/представления/кнопки/и т.д. к виду, будет ли фоновое изображение слоя блокировать их, потому что CAlayer поддерживается UIView?

  • Когда вы устанавливаете цвет фона 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];
    }
    

Фоновое изображение в поле зрения:

background in 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:

background image in layer

4b9b3361

Ответ 1

  • UIView по умолчанию создается непрозрачным. Когда вы устанавливаете backgroundColor на шаблон с прозрачностью, он выбирает черный как цвет фона. Вы можете установить customViewController.view.opaque = NO;, чтобы можно было просматривать фон вашего представления за вашим.

  • Когда вы устанавливаете backgroundColor слоя на шаблон с прозрачностью, вы обходите логику UIView, поэтому непрозрачность представления игнорируется; так и преобразование UIView. CoreGraphics и друзья используют систему координат, где положительная ось y направлена ​​вверх. UIKit переворачивает эту систему координат. Вот почему изображение появляется вверх ногами.

  • Если вы добавляете метки/представления/кнопки/и т.д. будет отображаться правильно поверх фонового рисунка слоя.

  • Когда вы устанавливаете цвет фона вида, он выглядит так, как будто цвет фона слоя действительно установлен. (Я не видел этого документально нигде).

По сути, 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];
}

Примечание: обычно, когда вы переворачиваете координаты, вы указываете высоту. Для слоев вам не нужно это делать. Я не вникал в то, почему это так.

Как вы видите, здесь задействовано гораздо больше кода, и нет реального преимущества для этого. Я действительно рекомендую вам придерживаться подхода UIKit. Я только отправил код в ответ на ваше любопытство.