Изменение фрейма CALayer UIView (self.view.layer.frame = ...), кажется, не имеет никакого эффекта - PullRequest
6 голосов
/ 22 октября 2011

Я уверен, что мне здесь чего-то не хватает. Я пробую код CALayers 'hello world' из:

http://www.raywenderlich.com/2502/introduction-to-calayers-tutorial

Делаем самый первый пример. Новый проект с одним представлением в xcode 4.2. Без изменений в перо / раскадровка. Импорт QuartzCore. Добавьте следующий код в ViewDidLoad в ViewController.m:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.layer.backgroundColor = [UIColor blueColor].CGColor;
    self.view.layer.cornerRadius = 30.0;    
    self.view.layer.frame = CGRectMake(20, 20, 20, 20);
}

Я запускаю это (ipad 2 или ipad simulator) и получаю полноэкранный синий прямоугольник с закругленными углами. То, что я надеялся получить, было смещением синего прямоугольника 20x20 на 20/20.

Я четко получаю контроль над слоем представлений (как показано цветом и закругленными углами). Тем не менее, настройка кадра, кажется, не имеет никакого влияния. Я NSLog'ed фрейм до / после его установки, и он изменился. Фрейм корневого слоя привязан к фрейму uiview?

У меня нет веских оснований для изменения рамки слоев представлений, я просто пытаюсь разобраться в том, что происходит. Надеюсь, это простой вопрос ...

Спасибо!

Пол

Ответы [ 2 ]

10 голосов
/ 23 октября 2011

На самом деле предыдущий ответ (вы не можете установить uiview.layer.frame, поскольку он всегда заполняет uiview) близок, но не совсем завершен. Прочитав ответ, я зарегистрировался на исходном сайте и прокомментировал, что у учебника были проблемы. При этом я обнаружил, что уже были комментарии, которых я не видел в своем первом проходе, которые касались этого. Используя их, я начал проводить тестирование.

Нижняя строка, если вы переместите код настройки self.view.layer.frame из viewDidLoad в viewWillAppear, он работает нормально. Это означает, что вы можете изменить рамку корневого слоя вида. Однако, если вы сделаете это в viewDidLoad, это будет отменено позже.

Однако предыдущий ответ все еще довольно близок. Я NSLog'ed рамку корневого слоя и рамку вида. Изменение рамки корневого слоя приводит к изменению рамки просмотра. Таким образом, ответ, что view.layer.frame всегда заполняет view.frame, является правильным. Однако установка рамки слоя сбрасывает рамку вида для соответствия. (Я предполагаю, что свойство uiview.frame просто возвращает uiview.layer.frame ...)

Итак, в какой-то момент времени между 2010 и сегодняшним днем ​​что-то в окружающей среде изменилось. В частности, после viewDidLoad и перед viewWillAppear фрейм uiview / layer, по-видимому, сбрасывается к указанному значению пера. Это отменяет любые изменения в viewDidLoad. Изменения, сделанные в viewWillAppear, выглядят как прилипшие.

Ответ Робина сделал меня на правильном пути, но я хотел изложить полный ответ.

9 голосов
/ 22 октября 2011

Учебник неправильный.Установка рамки основного слоя вида не имеет никакого эффекта.Основной слой является «специальным» и всегда будет заполнять границы представления.То, что вам нужно сделать, это создать подслой основного слоя следующим образом:

- (void)viewDidLoad
{
    [super viewDidLoad];

    CALayer *newLayer = [[CALayer alloc] init];

    newLayer.backgroundColor = [UIColor orangeColor].CGColor;
    newLayer.cornerRadius = 20.0;
    newLayer.frame = CGRectMake(100.0f, 100.0f, 200.0f, 200.0f);

    [self.view.layer addSublayer:newLayer];

    [newLayer release]; // Assuming you're not using ARC
}

Кроме того, в вашем коде слой шириной 20pt и высотой 20pt слишком мал, чтобы все равно иметь закругленные углы 30pt.1004 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...