Как сделать секретную анимационную анимацию приложения для iOS

Я пытаюсь дублировать переход текстовой метки секретного приложения. Кто-нибудь лучший способ приблизиться к нему?

Похоже, что каждая буква начинается с чистого текста, а затем анимирует ее до серого, а затем белого текста.

Вот несколько скриншотов: enter image description hereenter image description hereenter image description hereenter image description here

Ответ 1

Вот еще одно решение https://github.com/zipme/RQShineLabel

Я использую CADisplayLink вместе с NSAttributedString таким образом, что нам нужен только один UILabel, посмотрите:)

Ответ 2

Спасибо всем за помощь. Я смог заставить это работать с некоторой модификацией, чтобы лейбл исчезал снова и снова. Вот мой полный исходный код: https://github.com/NatashaTheRobot/SecretTextAnimationExample

Ответ 3

Вот возможный способ.

Во-первых, учтите, что UILabel может удерживать и отображать NSAttributedString. Используя NSMutableAttributedString, вы можете сделать каждую букву другого цвета.

Итак, начните с двух ярлыков, один справа поверх другого (т.е. перед ним, скрывая его), с тем же текстом, но с разной буквой. Теперь угадайте альфу верхнего уровня до нуля, тем самым постепенно раскрывая ту, что стоит за ней. Таким образом, каждая буква будет постепенно воспринимать цвет буквы позади нее.

Ответ 4

Я только собираюсь расширить то, что сказал @matt, с быстрым примером того, как это можно сделать. Вы начинаете с двух меток, один непосредственно поверх другого с теми же атрибутами и выравниваниями. После того, как оба ярлыка настроены, и вы готовы к анимации, все, что вам нужно сделать, - это вытеснить верхнюю метку.

- (void)awakeFromNib
{
    [super awakeFromNib];

    [self.view setBackgroundColor:[UIColor blackColor]];

    NSString *text = @"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.";

    UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 100.0, 320.0, 200.0)];
    [label1 setNumberOfLines:0];
    [label1 setBackgroundColor:[UIColor clearColor]];
    [label1 setAttributedText:[self randomlyFadedAttStringFromString:text]];
    [self.view addSubview:label1];

    UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 100.0, 320.0, 200.0)];
    [label2 setNumberOfLines:0];
    [label2 setBackgroundColor:[UIColor clearColor]];
    [label2 setTextColor:[UIColor whiteColor]];
    [label2 setAttributedText:[[NSAttributedString alloc] initWithString:text]];
    [self.view addSubview:label2];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        [UIView animateWithDuration:1.0 animations:^{
            [label2 setAlpha:0.0];
        } completion:^(BOOL finished) {
            [label2 removeFromSuperview];
        }];
    });
}

Затем создайте специальную атрибутную строку для нижней метки. Эта атрибутная строка не должна изменять атрибут, который вы установили на другой ярлык, отличный от атрибута NSForegroundColorAttributeName. Вы можете или не захотеть придумать какой-либо алгоритм, чтобы определить, какие буквы должны исчезнуть по какой-либо сумме, но приведенный ниже код будет генерировать атрибутную строку из входной строки, где каждая буква альфа является просто случайным значением между 0 и 1.

- (NSAttributedString *)randomlyFadedAttStringFromString:(NSString *)string
{
    NSMutableAttributedString *outString = [[NSMutableAttributedString alloc] initWithString:string];

    for (NSUInteger i = 0; i < string.length; i ++) {
        UIColor *color = [UIColor colorWithWhite:1.0 alpha:arc4random_uniform(100) / 100.0];
        [outString addAttribute:NSForegroundColorAttributeName value:(id)color range:NSMakeRange(i, 1)];
    }

    return [outString copy];
}