【问题标题】:Reload UIView With UIViewAnimationOptionTransitionCurlUp Animation使用 UIViewAnimationOptionTransitionCurlUp 动画重新加载 UIView
【发布时间】:2013-02-26 15:16:47
【问题描述】:

我需要使用 UIViewAnimationOptionTransitionCurlUp 动画重新加载(更新)self.view。在视觉上,旧视图以卷曲效果进行动画处理,并且在其后呈现新的更新视图。我找不到比创建当前视图的屏幕截图更好的方法,将其放在最上面,然后应用动画将其卷起并删除。旧视图卷起后,更新后的视图元素会很好地呈现出来。

但是,卷曲不起作用。过渡变得淡出而不是卷曲。怎么了?代码如下。

UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0.0);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *screenshot = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

UIView* screenView = [[UIView alloc] initWithFrame:self.view.frame];
screenView.tag = TAG_SCREENSHOT_VIEW;
screenView.backgroundColor = [UIColor colorWithPatternImage:screenshot];
[self.view addSubview:screenView];
[screenView.superview bringSubviewToFront:screenView];

[UIView transitionWithView:screenView
                  duration:1.0f
                   options:UIViewAnimationOptionTransitionCurlUp
                animations:^ { screenView.alpha = 0.0f; }
                completion:^ (BOOL finished) {
                    [screenView removeFromSuperview];
                }];

【问题讨论】:

    标签: iphone objective-c uiview


    【解决方案1】:

    这是正确的版本:

    [UIView transitionWithView:self.view
                      duration:0.5f
                       options:UIViewAnimationOptionTransitionCurlUp
                    animations:^ { [screenView removeFromSuperview]; }
                    completion:nil];
    

    transitionWithView 是 self.view 和动画块应该删除 screenView

    【讨论】:

      【解决方案2】:

      您实际上是通过在动画中将其alpha 归零来淡出您的视图。

      尝试在动画块中添加子视图(并且仅在此处)以使视图添加动画:

      [UIView transitionWithView:self.view
                    duration:1.0f
                     options:UIViewAnimationOptionTransitionCurlUp
                  animations:^ { [self.view addSubview:screenView]; screenView.alpha = 0.0f; }
                  completion:^ (BOOL finished) {
                      [screenView removeFromSuperview];
                  }];
      

      无论如何,我不确定我能理解screenView.alpha = 0.0f; 在那里做什么。可能以下内容更接近您想要实现的目标(在这种情况下,您需要在制作动画之前添加子视图):

      [UIView transitionWithView:self.view
                    duration:1.0f
                     options:UIViewAnimationOptionTransitionCurlUp
                  animations:^ { [screenView removeFromSuperview]; }
                  completion:nil];
      

      【讨论】:

      • 使用起来可能更简单 + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView... 它会为您更新视图层次结构。
      • @danh:这是一个很好的选择;不过,我认为对 OP 来说重要的是了解如何修改自己的代码以使其工作。无论如何,谢谢。
      • 这种变化不构成修改吗? :-)
      • @sergio:谢谢,我正在尝试,尽管没有 alpha 0,视图现在就消失了,也没有注意到任何可见的动画。我会玩更多以了解正在发生的事情。也许,方法参数没有正确使用?
      • @danh:我也想过这种方法,但它在视觉上效果不佳。我想要一个旧视图蜷缩起来,新的更新视图会在它下面。因此 fromView 将与 toView 相同。我需要添加额外的层来实现它,我不想让事情复杂化。除非你认为我遗漏了什么?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多