2014-01-20 1 views
0

Я создал набор классной анимации, используя ярлыки на моем первом представлении.Повторное использование блоков массива анимации по точкам зрения?

Я не хочу переписывать этот код, так как я могу улучшить эту анимацию в будущем.

Однако я хочу использовать эту точную анимацию с разными метками на другом контроллере view/view. Они будут иметь одно и то же имя.

Как я могу это сделать, может ли кто-нибудь предложить/предоставить пример?

Это анимация блок массива код, который я на основе моего кода на ...

http://xibxor.com/2013/03/27/uiview-animation-without-nested-hell/

NSMutableArray* animationBlocks = [NSMutableArray new]; 

typedef void(^animationBlock)(BOOL); 

// getNextAnimation 
// removes the first block in the queue and returns it 
animationBlock (^getNextAnimation)() = ^{ 
    animationBlock block = animationBlocks.count ? (animationBlock)[animationBlocks objectAtIndex:0] : nil; 
    if (block){ 
     [animationBlocks removeObjectAtIndex:0]; 
     return block; 
    }else{ 
     return ^(BOOL finished){}; 
    } 
}; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    [UIView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
    } completion: getNextAnimation()]; 
}]; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    [UIView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
    } completion: getNextAnimation()]; 
}]; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    [UIView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
    } completion: getNextAnimation()]; 
}]; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    NSLog(@"Multi-step Animation Complete!"); 
}]; 

// execute the first block in the queue 
getNextAnimation()(YES); 

Вот пример моего кода

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    [UIView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
     lblLeft.transform = CGAffineTransformMakeScale(1.3,1.3); 
     lblMiddle.transform = CGAffineTransformMakeScale(1.3,1.3); 
     lblRight.transform = CGAffineTransformMakeScale(1.3,1.3); 
    } completion: getNextAnimation()]; 
}]; 

//add a block to our queue 
[animationBlocks addObject:^(BOOL finished){; 
    [UIView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
     lblLeft.transform = CGAffineTransformIdentity; 
     lblMiddle.transform = CGAffineTransformIdentity; 
     lblRight.transform = CGAffineTransformIdentity; 
    } completion: getNextAnimation()]; 
}]; 

У меня есть эти три метки на различные виды в разных контроллерах.

ответ

0

Вы пробовали обернуть их в объект с помощью методов класса, чтобы сохранить методы анимации внутри объекта, но передать представление методам обертки? Например:

Этот метод живет в классе FooAnimationUtilities:

+ (void)animateViewWithScale:(UIView *)myView { 
[animationBlocks addObject:^(BOOL finished){; 
    [myView animateWithDuration:1.0 animations:^{ 
     //...animation code... 
     lblLeft.transform = CGAffineTransformMakeScale(1.3,1.3); 
     lblMiddle.transform = CGAffineTransformMakeScale(1.3,1.3); 
     lblRight.transform = CGAffineTransformMakeScale(1.3,1.3); 
    } completion: getNextAnimation()]; 
}]; 
} 

Тогда из ваших других классов, которые хотят использовать этот класс ...

В ом выше вашей реализации в вашем различном классы:

#import "FooAnimationUtilities.h" 

А внутри методов вид класса (скажем, animateMe), которые нуждаются в анимации:

-(void)animateMe { 
    [FooAnimationUtilities animateViewWithScale:self]; 
} 

Итак, с точки зрения прохождения в ярлыках вы можете посмотреть, как изменить метод класса (UILabel *) lblLeft, или вы можете быть немного чище об этом и передать массив или dict, содержащий метку объекты. Вы можете даже пройти по шкале. Таким образом, имя метода класса будет выглядеть примерно так:

+ (void)animateView:(UIView *)myView andLabels:(NSArray *)labels withScale:(float)scale 
+0

Как уже упоминалось, я использую разные контроллеры. Я также попробовал добавить параметр animationBlocks, но у меня проблемы с метками. Спасибо, в любом случае. – Jules

+0

Да, я бы поставил эти методы класса в свой класс, которые вы можете импортировать в любые другие классы, которые в них нуждаются. – joshd

+0

Можете ли вы обновить код примера? – Jules

0

Вы можете использовать Категории. Категории используются для расширения функций существующих классов. Ниже приведена документация по категориям: Link

Если ваш код не полагается на UIController, который является вашим «я», вы можете поместить этот код в NSObject и создать его экземпляр или иметь статический экземпляр, если вам нужна анимация. Таким образом, вы можете просто вызвать [ObjectA animateMyAnimation];

+0

Хорошо, но я не уверен, как реализовать это в этом сценарии? Не уверен, как я буду передавать ярлыки и т. Д. – Jules

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

  • Нет связанных вопросов^_^