【问题标题】:Animate only views that are on-screen仅对屏幕上的视图进行动画处理
【发布时间】:2011-09-30 18:22:35
【问题描述】:

所以我想在包含特殊动画的应用视图之间进行转换。简而言之,所述动画淡出你所在页面的每个子视图,一个接一个,然后继续下一个。明显的问题是,如果我在某个时候使用 UIScrollView,我的动画只会淡出整个滚动视图的内容,这将花费太长时间,而不仅仅是您在屏幕上看到的内容。这让我想到了我的问题:

是否可以获得当前在屏幕上可见的 UIView 的所有子视图?

提前致谢

【问题讨论】:

    标签: iphone objective-c animation screen subview


    【解决方案1】:

    您可以检查哪些视图位于滚动视图的可见区域,如下所示:

    CGRect visibleArea = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y, scrollView.view.frame.size.width, scrollView.view.frame.size.height);
    NSMutableArray *visibleViews = [[NSMutableArray alloc] init];
    for(UIView *view in scrollView.subviews){
      if(CGRectIntersectsRect(visibleArea, view.frame)
        [visibleViews addObject:view];
    }
    

    结果将是您将拥有一个数组 (visibleViews),其中包含所有 rects 与滚动视图的可见 rect 相交的视图。然后,您可以仅对所述数组中的视图进行动画处理。

    附言。我没有测试该代码,但它应该可以为您提供大致的思路。

    【讨论】:

      【解决方案2】:

      循环遍历动画中的所有子视图,并在提交动画之前将它们从父视图中移除,然后更改 VC:

      [UIView beginAnimations:nil context:NULL];
      [UIView setAnimationDuration:1.0f];
      for (UIView *view in self.view.subviews) {
          [view removeFromSuperview];
      }
      [UIView commitAnimations];
      [self.navigationController performSelector:@selector(pushViewController:) withObject:viewControllerToSwitchTo afterDelay:1.0f];
      

      【讨论】:

      • 感谢您的回答,但我在写问题时犯了一个错误......重要的部分是它不会立即为所有子视图设置动画,而是一个接一个,这就是为什么它会在 UIScrollview 中花费太长时间。编辑了那个。但如果您仍有任何建议,我会很高兴听到他们的意见!
      • 哦,我明白你的意思了。我不认为你能做到这一点。我认为您需要通过为每个视图键入一次[view... removeFromSuperview] 来手动从其超级视图中删除所有视图。
      猜你喜欢
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-19
      相关资源
      最近更新 更多