代码之家  ›  专栏  ›  技术社区  ›  JosephH

使用单步旋转时如何实现平滑动画/如何在旋转开始时获得新的帧大小?

  •  4
  • JosephH  · 技术社区  · 14 年前

    我正在尝试从两级旋转切换到一级旋转(以避免控制台警告,因为苹果建议这样做,因为一级更快)。

    但是,我不知道如何尽早获得视图的新大小(考虑导航栏、状态栏等),以便在动画期间执行UI的更新(而不是像许多应用程序那样简单地在最后将项目捕捉到新位置,这将导致动画结尾处出现一个大的“急动”。

    willAnimateRotationToInterfaceOrientation:duration:

    我可以看出我应该能够手工计算它,计算出当前的栏高度,然后通过从旋转屏幕尺寸中扣除这些来推断新的视图框尺寸(这并不是很难做到,但它可能很脆弱,因为它假设导航栏、状态栏等在两个方向上的高度相同,并且您必须手动考虑工具栏在纵向和横向上的高度不同-我只是想确保我没有错过更直接或更常见的方法。)

    太好了!

    谢谢

    约瑟夫

    4 回复  |  直到 14 年前
        1
  •  5
  •   Hilton Campbell    14 年前

    使用视图的layoutSubviews方法进行自动旋转是最成功的。在方向更改期间调用layoutSubviews时,视图的边界已设置为旋转结束时的边界。此时,您还可以查询状态栏、导航栏和工具栏的大小,并获得正确的后期旋转值(尽管状态栏的宽度和高度可能会互换——我只是将较小的值作为高度,效果很好)。使用这些信息可以布局子视图,然后它们将作为旋转的一部分设置动画。

    为每种情况创建一个UIView子类都会很烦人,所以我创建了一个特殊的UIView子类DelegatingView,如下所示:

    @protocol DelegatingViewDelegate
    
    - (void)layoutSubviewsForView:(UIView*)view;
    
    @end
    
    @interface DelegatingView : UIView {
        id<DelegatingViewDelegate> _delegate;
    }
    
    @property (nonatomic,assign) id<DelegatingViewDelegate> delegate;
    
    @end
    
    @implementation DelegatingView
    
    @synthesize delegate = _delegate;
    
    - (void)layoutSubviews {
        [super layoutSubviews];
        [_delegate layoutSubviewsForView:self];
    }
    
    @end
    

        2
  •  3
  •   adurdin    14 年前

    你的目标是哪个操作系统版本?在OS4.0下(我在其中做了一个快速测试), [view bounds] willAnimateRotationToInterfaceOrientation:duration: 返回新的旋转后边界。

    如果你没有看到,我建议你仔细检查一下你的视图是否设置了合适的自动调整大小的遮罩。

        3
  •  2
  •   Jerry Jones    14 年前

    如果在视图控制器的视图中有复杂的布局要求,那么创建UIView的子类并在-layoutSubviews(视图布局的正确位置)中执行布局代码是值得的。正如希尔顿坎贝尔所指出的,如果你使用这种布局方法,你可以检查帧大小和子视图的关系,并适当地设置它们的新位置。

    如果视图控制器的视图有一组简单的子视图,那么您应该适当地设置它们的autoresizingMask属性,并让它们自动设置自己的动画。

        4
  •  0
  •   AechoLiu    14 年前

    1.)在-(void)视图出现后通知子视图调整其大小; 缺点是每次出现viewwill时都会执行它。

    前任:

    
    - (void)viewWillAppear:(BOOL)animated
    {
      [super viewWillAppear:animated];
      [self notifyChildViewWillAppear:animated];
    }
    
    

    at child view - (void)notifyChildViewWillAppear:(BOOL)animated { // at this time, the size of superview's bounds //equals the content view's size // (no navigationBar's height and toolbar's height. self.frame = [self superview].bounds; }

    2.)手工计算所需尺寸。 导航栏和工具栏的大小可以通过以下代码导出。

    
    self.navagationController.navigationBar.view.frame.size.height;
    self.tabBarController.tabBar.frame.size.height;