Отношения между UIVIew и CALayer относительно фонового изображения на iOS - PullRequest
12 голосов
/ 07 мая 2011

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

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

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

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

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

1 Ответ

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

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

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

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

По сути, UIKit - это высокоуровневый интерфейс, который в итоге рендерится на слои.

Надеюсь, это поможет.

РЕДАКТИРОВАТЬ 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. Я только опубликовал код в ответ на ваше любопытство.

...