2017-02-21 4 views
0

У меня есть эта простая анимация, которая исчезает в нескольких ярлыках по одному. Но мне интересно, можно ли уменьшить код с помощью этой логики?IOS/Objective-c: сокращение кода в анимации

[UIView animateWithDuration:0.50f animations:^{ 
    [_latLabel setAlpha:0.9f]; 
    [_firstLat setAlpha:0.9f]; 
} completion:^(BOOL finished) { 
    [UIView animateWithDuration:0.50f animations:^{ 
     [_lonLabel setAlpha:0.9f]; 
     [_firstLon setAlpha:0.9f]; 
    }completion:^(BOOL finished) { 
     [UIView animateWithDuration:0.50f animations:^{ 
      [_speedLabel setAlpha:0.9f]; 
      [_firstSpeed setAlpha:0.9f]; 
     }completion:^(BOOL finished) { 
      [UIView animateWithDuration:0.50f animations:^{ 
       [_realNorthLabel setAlpha:0.9f]; 
       [_firstReal setAlpha:0.9f]; 
      }completion:^(BOOL finished) { 
       [UIView animateWithDuration:0.50f animations:^{ 
        [_magneticNorthLabel setAlpha:0.9f]; 
        [_firstMagnetic setAlpha:0.9f]; 
       }]; 
      }]; 
     }]; 

    }]; 

}]; 
+0

Используйте функции с задержкой запуска – zombie

+0

хорошо я пытаюсь ваше предложение, но я получаю много ошибок ... – FuManchu

+0

Таким образом, вы создали функцию с параметр запуска задержки, и вы получаете сообщение об ошибке, как вы это сделали – zombie

ответ

1

Учитывая необходимость выполнения операции на 2 объекте метки во время выполнения какой-либо одной секции блока анимации, создать dictionary структуры, в которой section indexes определяют хронологических порядков разделов анимации должны быть выполнен & каждый индекс раздела содержит объекты с меткой array.
Простой итерационный цикл над этой структурой, окрещенный здесь, поскольку dictionaryOfSectionedLabels может помочь в достижении желаемой альтернативной реализации анимации.

NSDictionary<NSNumber *, NSArray *> *dictionaryOfSectionedLabels = @{ @0: @[_latLabel, _firstLat], 
                     @1: @[_lonLabel, _firstLon], 
                     @2: @[_speedLabel, _firstSpeed], 
                     @3: @[_realNorthLabel, _firstReal], 
                     @4: @[_magneticNorthLabel, _firstMagnetic] 
                    }; 

for (NSUInteger i = 0; i < dictionaryOfSectionedLabels.allKeys.count; i++) { 

    [UIView animateWithDuration:0.5 delay:0.5*i options:UIViewAnimationOptionLayoutSubviews animations:^{ 

     UILabel *firstLabel = [dictionaryOfSectionedLabels[@(i)] firstObject]; 
     UILabel *secondLabel = [dictionaryOfSectionedLabels[@(i)] lastObject]; 

     firstLabel.alpha = 0.9f; 
     secondLabel.alpha = 0.9f; 

    } completion:nil]; 
} 
+0

это отличное решение! еще раз спасибо ystack :) – FuManchu

+0

рад помочь @FuManchu :) – ystack

1

Создание NSDictionary ваших меток может быть утомительным и запутанным код для чтения в будущем. Я бы рекомендовал вам просто создать метод.

-(void)customFadeForLabel:(UILabel *)theLabel withDelay:(float)delayAmount { 

    [UIView animateWithDuration:0.50f 
          delay:delayAmount 
         options:UIViewAnimationOptionCurveEaseInOut 
        animations:^{ 
         [theLabel setAlpha:0.9f]; 
        }completion:nil]; 

} 

Тогда просто назвать его по мере необходимости с задержками

[self customFadeForLabel:_latLabel withDelay:0.00f]; 
[self customFadeForLabel:_firstLat withDelay:0.00f]; 

[self customFadeForLabel:_lonLabel withDelay:0.50f]; 
[self customFadeForLabel:_firstLon withDelay:0.50f]; 

[self customFadeForLabel:_speedLabel withDelay:1.00f]; 
[self customFadeForLabel:_firstSpeed withDelay:1.00f]; 

[self customFadeForLabel:_realNorthLabel withDelay:1.50f]; 
[self customFadeForLabel:_firstReal withDelay:1.50f]; 

[self customFadeForLabel:_magneticNorthLabel withDelay:2.00f]; 
[self customFadeForLabel:_firstMagnetic withDelay:2.00f]; 
+0

Спасибо, это тоже хорошее решение :) – FuManchu

Смежные вопросы