UIView Subview для анимации
Моя цель - анимировать пользовательский интерфейс, и я использую анимацию UIView. Проблема в том, что мне нужно более одной анимации одновременно, но, очевидно, я могу одновременно выполнять только одну анимацию UIView. Ранее я задавал вопросы по этой теме ( Multiple UIView Animations), и все респонденты говорят, что я должен назначить делегата для анимации таким способом, как animationDidStop:performSelector:
но мне было интересно, могу ли я вместо этого добавить подпредставления к основному виду и выполнять анимацию одновременно для каждого подпредставления. Кроме того, я не могу выполнить анимацию спина к спине, и я подумал, может быть, я мог бы выполнить анимацию на view1, а затем на view2 без делегирования.
Например:
//Header
@property (nonatomic, strong) UIView *view1;
@property (nonatomic, retain) UIView *view2;
//Implementation
@synthesize view1;
@synthesize view2;
//ViewDidLoad
view1 = [[UIView alloc]initWithFrame:CGRectMake(0,0,480,640)];
view2 = [[UIView alloc]initWithFrame:CGRectMake(0,0,480,640)];
view1.backgroundColor = [UIColor clearColor];
view2.backgroundColor = [UIColor clearColor];
[performAnimationsOn View1]; //I don't know the code I would put here because the code
//I usually use is [UIView beginAnimation:@"animation"
//context:nil]; but that is a class method and I am not
//sure how to perform an animation on a specific subview.
[performAnimationsOn View2];
3 ответа
Я не вижу здесь проблемы, если вам нужно анимировать два разных вида одновременно, сделайте следующее:
//First add these subviews
[self.view addSubview:view1];
[self.view addSubview:view2];
[UIView beginAnimations:@"Animation1" context:nil];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:1];
//Do something with view 1 move, change alpha, change transformation etc..
[UIView commitAnimations];
Также добавьте следующую функцию
- (void) animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context
{
if ([animationID isEqualToString:@"Animation1"]) {
[UIView beginAnimations:@"Animation2" context:nil];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:1];
//Do something with view 2 move, change alpha, change transformation etc..
[UIView commitAnimations];
}
else if ([animationID isEqualToString:@"Animation2"]) {
[UIView beginAnimations:@"Animation3" context:nil];
[UIView setAnimationDidStopSelector:@selector(animationDidStop:finished:context:)];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:1];
//Do something with view 3 move, change alpha, change transformation etc..
[UIView commitAnimations];
}
//And so on.....
}
Анимация должна происходить последовательно
Это похоже на случай, когда вы можете рассмотреть возможность использования CABasicAnimations и, возможно, группы CAAnimation для выполнения ваших анимаций.
Когда вы используете UIView beginAnimationsContext, неявные свойства, которые вы изменяете в пределах контекста контекста (например, перед вызовом [UIView commitAnimations]), будут анимироваться одновременно.
Использование CABasicAnimations немного сложнее, но учитывает тип поведения, который вы хотите. Например, вы можете добавить анимацию к конкретным видам (точнее, к их слоям).
Вот простой урок.
Вы можете использовать несколько методов, и метод animationDidStop будет вызывать каждую анимацию по очереди, как предложил другой автор.
Однако проще и проще использовать новые методы анимации на основе блоков, такие как animateWithDuration: animations: завершение.
Этот метод позволяет передать блок завершения, который выполняется после завершения анимации. Этот код может затем вызвать следующую анимацию в вашей последовательности.
Блок анимации может анимировать несколько видов одновременно, если хотите. (в этом случае можно начать beginAnimations / commitAnimations. Вы просто применяете изменения к нескольким представлениям между вызовами beginAnimations и commitAnimations.