Альтернатива для UIPicker - PullRequest
1 голос
/ 21 марта 2012

Есть ли другой метод для приложения SLOT-MACHINE?Это потому, что метод UIPICKER не имеет медленного эффекта анимации.

Ответы [ 3 ]

3 голосов
/ 21 марта 2012

Это можно сделать с помощью анимации 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];
    }
}

Чтобы повернуть его, все, что вам нужно сделать, это изменить вращающуюся часть преобразования.Для дополнительного кредита вы можете добавить растущую тень к слоям, когда они удаляются от центра.

2 голосов
/ 21 марта 2012

Мы делаем домашнее задание?

Используйте вертикальные UIScrollViews бок о бок, включите подкачку страниц, UIImageViews для представлений.

По умолчанию он будет выглядеть плоским, но функционально будет эквивалентен.

Вам понадобится немного Core Animation / Core Graphics, чтобы сделать его более похожим на UIPickerView.

2 голосов
/ 21 марта 2012

Вы можете использовать UIImageView для каждой цифры / символа и анимировать движение изображений, которые вы отображаете. Использование UIPicker будет ограничено буквами и цифрами; с помощью UIImageView вы можете добавить другие типичные изображения игровых автоматов, такие как вишня и т. д.

...