3

我尝试了以下几种变体均无济于事。我想要的是显示一些东西的向下卷曲过渡,然后是相反的卷曲过渡。有透明度,所以效果是一个清晰的东西滚下一个视图。这是在上卷和下卷时调用的函数:

-(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=一起运行时YEStopFold在转换完成之前一直可见。也就是说,新的东西在它上面滚下来,好像有一个新东西在上面的视图的副本。然后一旦完成,它将用正确的版本替换整个内容。
为了澄清,我试图topFold在任何动画开始之前隐藏,但由于某种原因,它坚持在动画完成之前一直徘徊。会喜欢这里的指针。

4

2 回答 2

1

从笨拙但有效的部门,我嵌套了两个动画,一个在另一个的完成块中。看起来像这样并且有效:

 [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;
                                                }
                                            }
                             ];
                        }
         ];
于 2012-08-01T02:56:37.440 回答
0

另一种方法是通过在短时间内启动 runloop 来给 topFold 视图隐藏时间。

if (isVisible){
    self.topFold.hidden = YES;
    [[NSRunLoop currentRunLoop] runUntilDate: [NSDate dateWithTimeIntervalSinceNow: 0.0001]];
}
于 2013-02-06T00:29:32.823 回答