Чтобы сложить ваши виды и применить к ним перспективу, вам нужно сначала разместить их в разных позициях Z, а затем применить эффект перспективы к содержащему слою.
Я полагаю, что следующий код сделает это, но я не проверял это (я делал нечто подобное с чистыми CALayers, поэтому общие принципы верны):
- (void)viewDidLoad {
UIImageView *three = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"3.png"]];
three.center = CGPointMake(160 + 60, 240 - 60);
[self.view addSubview:three];
three.layer.zPosition = -100;
UIImageView *two = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"2.png"]];
two.center = CGPointMake(160, 240);
[self.view addSubview:two];
two.layer.zPosition = 0;
UIImageView *one = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"1.png"]];
one.center = CGPointMake(160 - 60, 240 + 60);
[self.view addSubview:one];
one.layer.zPosition = 100;
// release the images
[one release];
[two release];
[three release];
CATransform3D theTransform = self.view.layer.sublayerTransform;
theTransform.m34 = 1.0 / -500;
self.view.layer.sublayerTransform = theTransform;
[super viewDidLoad];
}
В вашем коде вы устанавливаете только соответствующую часть CATransform3D на каждом уровне представления (это то, что делает компонент m34 матрицы CATransform3D). Вы на самом деле не перемещаете их в плоскости Z. Вы можете использовать преобразование для этого, но я обнаружил, что свойство zPosition
ваших CALayers обеспечивает более чистый способ определения расположения слоев в 3-D.
После того, как вы разместили слои относительно друг друга (с отрицательными значениями, уходящими от точки зрения пользователя), вам нужно применить эффект перспективы ко всем слоям, размещенным в вашем главном представлении. Для этого я считаю, что установка sublayerTransform
слоя представления хостинга необходима для правильного применения перспективы ко всем размещенным слоям.
Если вы хотите повернуть серию изображений, используйте CATransform3DRotate()
в подслоеПреобразование слоя основного вида хостинга.
В качестве примера приложения, которое выполняет трехмерные манипуляции с CALayers, с перспективой, примененной к ним, посмотрите проект, на который я ссылаюсь во втором обновлении моей статьи здесь .