Анимация нескольких uiscrollview встречных как - PullRequest
1 голос
/ 23 января 2012

У меня есть какой-то счетчик, построенный из нескольких UIScrollViews, содержащих изображения чисел.Счетчик периодически обновляется старым и новым номером и продолжительностью анимации.Обновление на самом деле для цикла всегда увеличивает счетчик на +1.Когда я помещаю это в блок анимации, анимация выполняется так, как будто я только что обновил ее до toValue, как будто нет цикла for.

Я хочу, чтобы анимация выполнялась линейно, я хочу видеть каждое число(в случае, если анимация не слишком быстрая, что не так).В каком-то странном сценарии счетчик просто переходит на некоторое случайное число в интервале [fromValue, toValue] без анимации, а затем анимированный - на toValue.

Есть предложения?Вот код

- (void) setDigit:(UIScrollView*)digit withValue:(int)value
{
    CGFloat height = digit.frame.size.height;
    [digit setContentOffset:CGPointMake(0, height * value) animated:NO];
}

- (void) updateValue:(int) value
{
     for (int i = 5; i >= 0; i--)
     {
        int a = value % 10;
        value = value / 10;

        [self setDigit:[digits objectAtIndex:i] withValue:a];
     }
}

- (void) transitFromValue:(int)fromValue toValue:(int)toValue withDuration:(float)duration
{
    [UIView animateWithDuration:duration 
                      delay:0.0 
                    options:UIViewAnimationCurveLinear
                 animations:^ {
                     for (int tValue = fromValue; tValue <= toValue; tValue++)
                     {
                         [self updateValue:tValue];
                     }

                 } 
                 completion:^(BOOL finished) {
                 }];

}

Ответы [ 2 ]

3 голосов
/ 23 января 2012

Конечные значения свойств, установленных в блоке анимации, - это то, что система будет использовать для анимации. Вы можете установить тысячи различных значений для цикла for, но только последнее будет использоваться для анимации.

Ваше лучшее решение - это рекурсивный метод, который анимирует один шаг и вызывается снова, когда он будет сделан.

- (void) transitFromValue:(int)fromValue toValue:(int)toValue withDuration:(float)duration
{
    [UIView animateWithDuration:duration 
                      delay:0.0 
                    options:UIViewAnimationCurveLinear
                 animations:^ {
                     [self updateValue:fromValue + 1];
                 } 
                 completion:^(BOOL finished) {
                     if (finished && fromValue + 1 < toValue) {
                         [self transitFromValue:fromValue + 1 toValue:toValue withDuration:duration];
                     }
                 }];

}
1 голос
/ 23 января 2012

Я думаю, что проблема в том, что анимация не запускается при запуске цикла for. Он проходит через тупик, а затем видит последнее значение и оживляет до этого значения. Но я не уверен на 100%, если это проблема. Может быть, если вы попытаетесь сделать это:

int tValue=fromValue;
[UIView animateWithDuration:duration 
                      delay:0.0 
                    options:UIViewAnimationCurveLinear
                 animations:^ {
                     [self updateValue:tValue];
                 } 
                 completion:^(BOOL finished) {
                 tValue++;
                 }];
[UIView animateWithDuration:duration 
                      delay:0.0 
                    options:UIViewAnimationCurveLinear
                 animations:^ {
                     [self updateValue:tValue];
                 } 
                 completion:^(BOOL finished) {
                 tValue++;
                 }];

или вставьте анимацию в цикл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...