Одновременное отображение и скрытие с помощью transitionWithView

Я пробовал несколько вариантов следующего безрезультатно. То, что я хочу, - это переход с завитком вниз, который показывает некоторые вещи, а затем переход с завитком вверх, который делает противоположное. Существует прозрачность, поэтому создается эффект прозрачной вещи, катящейся по виду. Это функция, которая вызывается при сворачивании и сворачивании:

-(void) setVisibility:(BOOL)isVisible animated:(BOOL)animated{    
    if (isVisible){
        self.topFold.hidden = YES;
    }
    [UIView transitionWithView:self 
                      duration:1.0f 
                       options:isVisible ? UIViewAnimationOptionTransitionCurlDown : UIViewAnimationOptionTransitionCurlUp
                    animations:^{
                        self.imageView.hidden = !isVisible;
                        self.background.hidden = !isVisible;
                        self.bottomCornerFold.hidden = !isVisible;
                    }
                    completion:^(BOOL finished){
                        if (!isVisible){
                            self.topFold.hidden = NO;
                        }
                    }
    ];
}

Я пробовал миллиарды разных сценариев, но этот самый близкий. Однако проблема заключается в том, что когда он запускается с isVisible = YES, topFold остается видимым до тех пор, пока не будут выполнены переходы. Другими словами, новый материал скатывается поверх него, как если бы это была копия представления, на которое накладывается новый материал. И затем, как только это будет сделано, он заменит все это правильной версией.
Чтобы уточнить, я пытаюсь скрыть topFold до того, как начнется любая анимация, но по какой-то причине он настаивает на том, чтобы зависнуть, пока анимация не будет сделана. Хотелось бы указатель здесь.


person Kardasis    schedule 31.07.2012    source источник


Ответы (2)


Из неуклюжего, но эффективного отдела я вложил две анимации, одну в блок завершения другой. Выглядит так и работает:

 [UIView transitionWithView:self 
                          duration:0.0f 
                           options:nil
                        animations:^{
                            if (isVisible){
                                self.topFold.hidden = YES;
                            }
                        }
                        completion:^(BOOL finished){
                            [UIView transitionWithView:self 
                                              duration:1.0f 
                                               options:isVisible ? UIViewAnimationOptionTransitionCurlDown : UIViewAnimationOptionTransitionCurlUp
                                            animations:^{
                                                self.imageView.hidden = !isVisible;
                                                self.background.hidden = !isVisible;
                                                self.bottomCornerFold.hidden = !isVisible;
                                            }
                                            completion:^(BOOL finished){
                                                if (!isVisible){
                                                    self.topFold.hidden = NO;
                                                }
                                            }
                             ];
                        }
         ];
person Kardasis    schedule 01.08.2012

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

if (isVisible){
    self.topFold.hidden = YES;
    [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.0001]];
}
person Klaas    schedule 06.02.2013