Graphics Reference
In-Depth Information
{
[
super
viewDidLoad
];
//add the door
self
.doorLayer = [
CALayer
layer
];
self
.doorLayer.
frame
=
CGRectMake
(
0
,
0
,
128
,
256
);
self
.doorLayer.
position
=
CGPointMake
(
150
-
64
,
150
);
self
.doorLayer.
anchorPoint
=
CGPointMake
(
0
,
0.5
);
self
.doorLayer.
contents
=
(
__bridge
id
)[
UIImage
imageNamed
:
@"Door.png"
].
CGImage
;
[
self
.containerView.
layer
addSublayer
:
self
.doorLayer];
//apply perspective transform
CATransform3D
perspective =
CATransform3DIdentity
;
perspective.
m34
= -
1.0
/
500.0
;
self
.containerView.
layer
.
sublayerTransform
= perspective;
//add pan gesture recognizer to handle swipes
UIPanGestureRecognizer
*pan = [[
UIPanGestureRecognizer
alloc
]
init
];
[pan
addTarget
:
self
action
:
@selector
(pan:)];
[
self
.
view
addGestureRecognizer
:pan];
//pause all layer animations
self
.doorLayer.
speed
=
0.0
;
//apply swinging animation (which won't play because layer is paused)
CABasicAnimation
*animation = [
CABasicAnimation
animation
];
animation.
keyPath
=
@"transform.rotation.y"
;
animation.
toValue
=
@(
-
M_PI_2
)
;
animation.
duration
=
1.0
;
[
self
.doorLayer
addAnimation
:animation
forKey
:
nil
];
}
- (
void
)pan:(
UIPanGestureRecognizer
*)pan
{
//get horizontal component of pan gesture
CGFloat
x = [pan
translationInView
:
self
.
view
].
x
;
//con
vert from points to animation duration
//using a reasonable scale factor
x /=
200.0f
;
//update timeOffset and clamp result
CFTimeInterval
timeOffset =
self
.doorLayer.
timeOffset
;
timeOffset =
MIN
(
0.999
,
MAX
(
0.0
, timeOffset - x));
self
.doorLayer.
timeOffset
= timeOffset;