Это можно сделать с помощью анимации CALayer
.
Класс вашего основного слоя slotMachineView должен быть CATransformLayer
, чтобы разрешить трехмерные преобразования подслоев.
Допустим, у вас есть 10 квадратных изображений, которые представляют символы на барабане.Для каждого из ваших изображений создайте CALayer
свойство содержимого, которое является одним из ваших изображений.Затем к каждому слою необходимо применить 2 преобразования:
- Сначала вам нужно будет повернуть каждый слой (2 * PI) / 10 вокруг своей оси X
- Затем перевестинекоторое расстояние (которое вам нужно будет рассчитать) вдоль оси Z.
Теперь добавьте эти слои в слой вашего вида.Теперь вы должны увидеть «цилиндр» изображений вокруг оси X.
Чтобы повернуть цилиндр, вам нужно отрегулировать первое преобразование - либо с помощью CAAnimation
, либо с помощью таймера и настройкиВращение оси X со смещением, которое запускает таймер.
Я предоставлю вам полную информацию о реализации, но вот некоторый код для загрузки и создания начального "барабана"
int imageCount = 16;
for (int i = 0; i < imageCount; i++) {
// Load image from the bundle
NSString * fileName = [NSString stringWithFormat: @"Image-%d", i];
NSString * filePath = [[NSBundle mainBundle] pathForResource: fileName ofType: @"jpeg"];
UIImage * image = [UIImage imageWithContentsOfFile: filePath];
// Create a layer with the image as content - My image size was 60x60
CALayer * imageLayer = [CALayer layer];
imageLayer.bounds = (CGRect){CGPointZero, {60.0, 60.0}};
imageLayer.contents = (id)image.CGImage;
imageLayer.position = (CGPoint){CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)};
// Set the initial image transform - I've hardcoded the translate along the
// z-axis to 150, but this will vary depending on the number of images
// and their size - you'll need to do some maths to work it out... sines or
// cosines or somesuch
CGFloat angle = (2.0 * M_PI) / imageCount * i;
CATransform3D transform = CATransform3DMakeRotation(angle, 1.0, 0.0, 0.0);
transform = CATransform3DTranslate(transform, 0.0, 0.0, 150.0);
imageLayer.transform = transform;
[self.layers addObject: imageLayer];
[self.view.layer addSublayer: imageLayer];
}
}
Чтобы повернуть его, все, что вам нужно сделать, это изменить вращающуюся часть преобразования.Для дополнительного кредита вы можете добавить растущую тень к слоям, когда они удаляются от центра.