2013-03-16 1 views
3

В настоящее время я использую эту основную анимацию; (iOS 5, ARC)CoreAnimation: перенос анимационных объектов в следующий UIViewController

- (void)onTimer 
{ 
    // build a view from our image 
    UIImageView* flakeView = [[UIImageView alloc] initWithImage:flakeImage]; 

    // use the random() function to randomize up our flake attributes 
    int startX = round(random() % 320); 
    int endX = startX; //round(random() % 320); 
    double scale = 1/round(random() % 100) + 1.0; 
    double speed = 1/round(random() % 100) + 1.0; 

    // set the flake start position 
    flakeView.frame = CGRectMake(startX, -100.0, 25.0 * scale, 25.0 * scale); 
    flakeView.alpha = 0.8; 

    // put the flake in our main view 
    [self.view addSubview:flakeView]; 
    [self.view sendSubviewToBack:flakeView]; 

    [UIView beginAnimations:nil context:(__bridge void*)flakeView]; 
    // set up how fast the flake will fall 
    [UIView setAnimationDuration:10 * speed]; 

    // set the postion where flake will move to 
    flakeView.frame = CGRectMake(endX, 500.0, 25.0 * scale, 25.0 * scale); 

    // set a stop callback so we can cleanup the flake when it reaches the 
    // end of its animation 
    [UIView setAnimationDidStopSelector:@selector(onAnimationComplete:finished:context:)]; 
    [UIView setAnimationDelegate:self]; 
    [UIView commitAnimations]; 

} 
- (void)onAnimationComplete:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context { 

    UIImageView *flakeView = (__bridge UIImageView*)context; 
    [flakeView removeFromSuperview]; 
    flakeView = nil; 
} 

пожар;

[NSTimer scheduledTimerWithTimeInterval:(0.3) target:self selector:@selector(onTimer) userInfo:nil repeats:YES]; 

С помощью этого кода представлено 10 снежных хлопьев, падающих вниз.

С помощью этого кода и некоторых пользовательских режимов просмотра, я пытаюсь сделать действия навигации текучими. Проблема в том, что я не могу найти подходящий способ переноса этого (анимационного) контекста на следующий UIViewController, чтобы все анимированные снежные хлопья продолжали идти туда, куда они ушли, а в следующем UIViewControllerNSTimer будут стрелять новыми.

Любая помощь и предложения будут назначены.

+0

Непонятно, что вы пытаетесь передать. Вы хотите, чтобы фактическое изображение было передано следующему контроллеру? Возможно, было бы полезно описать, какой визуальный эффект вы ищете. Кстати, вы не должны использовать этот метод анимации. Вы должны использовать методы на основе блоков в iOS 4 или новее. – rdelmar

ответ

0

Возможно, вы можете разместить свой контекст в своем частном расширении этого класса.
Нравится: @property (nonatomic,weak)IBOutlet UIImageView*context;

0

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

Возможно, вам лучше написать код, который отслеживает представления, которые оживляют в массиве. Когда пришло время создать новый контроллер представления, запросите слой presentationLayer каждого слоя изображения и получите его позицию. Затем удалите все виды снежинок с текущего контроллера представления и передайте весь массив, а также массив позиций, в новый контроллер представления. Затем в представлении viewDidLoad нового диспетчера view добавьте массив просмотров снежинок на их предыдущие позиции и запустите их анимацию в свои предыдущие конечные позиции и запустите таймер анимации, чтобы начать добавлять больше снежинок.

+0

Я создал Singleton (Animation Manager) и отлично работал. Я отправлю ответ, как только у меня будет время. И +1 при удержании анимационных объектов в массиве. Ура! – Bartu

+0

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

+0

Менеджер является делегатом navigationController. Поэтому, когда происходит операция навигации, она просто добавляет анимирующие объекты (от массива) к новому контроллеру представления. Позвольте мне поместить код :) – Bartu

0

.h файл

@interface BeanManager : NSObject <UINavigationControllerDelegate> 
{ 
    NSMutableDictionary *beanDictionary; 
    UIViewController *currentViewController; 
    UIImage    *coffeebean; 
    NSTimer    *beanTimer; 
    NSInteger   contextTag; 
    BOOL    isDebugging; 
} 

@property (nonatomic, retain) NSMutableDictionary *beanDictionary; 
@property (nonatomic, retain) UIViewController  *currentViewController; 
@property (nonatomic) BOOL isDebugging; 

+ (id)sharedManager; 

- (void)invalidate; 
- (void)validate; 

@end 

.m файл

+ (id)sharedManager { 
    static BeanManager *sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 

- (id)init { 
    if (self = [super init]) { 
     coffeebean = [UIImage imageNamed:@"coffeebean"]; 

     // assign self as navigation controllers delegate 
     AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
     [appDelegate.navigationController setDelegate:self]; 

     self.currentViewController = appDelegate.navigationController.visibleViewController; 

     beanDictionary = [[NSMutableDictionary alloc] init]; 

     NSLog(@"%@ : Allocating",[self class]); 

     [self validate]; 
    } 
    return self; 
} 

- (void)dealloc { 
    if (isDebugging) { 
     NSLog(@"%@: Deallocating", [self class]); 
    } 
} 

#pragma mark - UINavigationController 
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    if (isDebugging) { 
     NSLog(@"%@: Pushing %d beans to new view",[self class], [[beanDictionary allKeys] count]); 
    } 
    for (UIImageView *animatingBeans in [beanDictionary allValues]) { 
     [viewController.view addSubview:animatingBeans]; 
     [viewController.view sendSubviewToBack:animatingBeans]; 
    } 

    self.currentViewController = viewController; 
} 

#pragma mark - Internals 
- (void)validate 
{ 
    beanTimer = [NSTimer scheduledTimerWithTimeInterval:(0.3) target:self selector:@selector(onTimerWithBlock) userInfo:nil repeats:YES]; 
} 

- (void)invalidate 
{ 
    [beanTimer invalidate]; 
} 

- (void)onTimerWithBlock 
{ 
    // build a view from our flake image 
    UIImageView* beanView = [[UIImageView alloc] initWithImage:coffeebean]; 

    // use the random() function to randomize up our flake attributes 
    int startX = round(random() % 320); 
    int endX = startX; //round(random() % 320); 
    double scale = 1/round(random() % 100) + 1.0; 
    double speed = 1/round(random() % 100) + 1.0; 

    // set the flake start position 
    beanView.frame = CGRectMake(startX, -100.0, 25.0 * scale, 25.0 * scale); 
    beanView.alpha = 0.8; 
    beanView.tag = contextTag; 

    [beanDictionary setObject:beanView forKey:[NSString stringWithFormat:@"%d",contextTag]]; 

    if (contextTag > 1000) { 
     contextTag = 0; 
    } 
    contextTag++; 

    // put the flake in our main view 
    [self.currentViewController.view addSubview:beanView]; 
    [self.currentViewController.view sendSubviewToBack:beanView]; 

    [UIView animateWithDuration:(speed * 10) animations:^{ 

     [beanView setFrame:CGRectMake(endX, 500.0, 25.0 * scale, 25.0 * scale)]; 

    } completion:^(BOOL finished) 
    { 
     [beanDictionary removeObjectForKey:[NSString stringWithFormat:@"%d",beanView.tag]]; 
     if (isDebugging) { 
      NSLog(@"%@: Dictionary Count %d",[self class], [[beanDictionary allKeys] count]); 
     } 
     [beanView removeFromSuperview]; 
    }]; 
} 

Этот код, казалось, сделать работу. До сих пор я не использую его как Singleton, но если я буду расширять этот код, он должен быть реализован как синглтон, просто для уточнения. И я использую NSDictionary вместо NSArray, который будет работать так же, как и я, я подумал, что могу добавить некоторые функции к нему, поэтому я сделал это

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