Сначала добавьте библиотеку QuartzCore в свой проект и #import <QuartzCore/QuartzCore.h>
Каждое представление имеет свойство layer
с под-свойствами, которые можно анимировать.Именно здесь вы найдете все действительно классные вещи, когда речь заходит о возможностях анимации (я предлагаю ознакомиться со свойствами класса CALayer
, которые вы можете установить - это поразит вас - динамические мягкие тени при любом просмотре?)
В любом случае, вернемся к теме.Чтобы повернуть двери в 3D, сначала расположите их так, как будто они закрыты, поэтому каждая дверь заполняет половину экрана.
Теперь установите их свойства view.layer.anchorPoint
следующим образом
leftDoorView.layer.anchorPoint = CGPoint(0, 0.5); // hinge around the left edge
rightDoorView.layer.anchorPoint = CGPoint(1.0, 0.5); // hinge around the right edge
Теперь примените следующую анимацию
[UIView animateWithDuration:0.5 animations:^{
CATransform3D leftTransform = CATransform3DIdentity;
leftTransform.m34 = -1.0f/500; //dark magic to set the 3D perspective
leftTransform = CATransform3DRotate(leftTransform, M_PI_2, 0, 1, 0); //rotate 90 degrees about the Y axis
leftDoorView.layer.transform = leftTransform;
//do the same thing but mirrored for the right door, that probably just means using -M_PI_2 for the angle. If you don't know what PI is, Google "radians"
}];
И это должно сделать это.
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: На самом деле я не проверял это, поэтому углы могут быть задом наперед, и перспектива может быть завинчивой,и т.д., но это должно быть хорошее начало, по крайней мере.
ОБНОВЛЕНИЕ: Любопытство одолело меня.Вот полностью рабочий код (предполагается, что левая и правая двери расположены в закрытом положении в файле пера):
- (void)viewDidLoad
{
[super viewDidLoad];
leftDoorView.layer.anchorPoint = CGPointMake(0, 0.5); // hinge around the left edge
leftDoorView.center = CGPointMake(0.0, self.view.bounds.size.height/2.0); //compensate for anchor offset
rightDoorView.layer.anchorPoint = CGPointMake(1.0, 0.5); // hinge around the right edge
rightDoorView.center = CGPointMake(self.view.bounds.size.width,self.view.bounds.size.height/2.0); //compensate for anchor offset
}
- (IBAction)open
{
CATransform3D transform = CATransform3DIdentity;
transform.m34 = -1.0f/500;
leftDoorView.layer.transform = transform;
rightDoorView.layer.transform = transform;
[UIView animateWithDuration:0.5 animations:^{
leftDoorView.layer.transform = CATransform3DRotate(transform, M_PI_2, 0, 1, 0);
rightDoorView.layer.transform = CATransform3DRotate(transform, -M_PI_2, 0, 1, 0);
}];
}
- (IBAction)close
{
[UIView animateWithDuration:0.5 animations:^{
CATransform3D transform = CATransform3DIdentity;
transform.m34 = -1.0f/500;
leftDoorView.layer.transform = transform;
rightDoorView.layer.transform = transform;
}];
}