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

Jos*_*phH 4 iphone objective-c rotation uiviewcontroller ipad

我正试图从两阶段旋转切换到一阶段旋转(以避免控制台警告,因为Apple建议这样做,因为一阶段更快).

然而,我无法弄清楚如何获得我的视图的新大小(考虑导航栏,状态栏等),足以在动画期间执行我的UI更新(而不是简单地将项目捕捉到他们的最终的新职位就像许多应用程序似乎一样,这会在动画结束时产生一个大的"混蛋".

我在willAnimateRotationToInterfaceOrientation:duration:方法中得到的尺寸(可能很明显)是旧尺寸.

我可以看到我应该能够手动计算它,计算当前的条形高度,然后通过从旋转的屏幕尺寸中扣除那些来推断新的视图框架尺寸?(这并不难做到,虽然可能很脆弱,因为它假设导航栏,状态栏等在两个方向都是相同的高度,你必须手动考虑工具栏的高度不同肖像与风景 - 我只是想确保我没有错过更直接或更常见的方式.)

任何有关其他人采取的方法的反馈都会很棒!

谢谢

约瑟夫

Hil*_*ell 5

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

为你想要的每个情况创建一个UIView子类可能很烦人,所以我创建了一个名为DelegatingView的UIView的特殊子类,如下所示:

@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
Run Code Online (Sandbox Code Playgroud)

我使用它作为我的基本视图,向其添加子视图,并将我的UIViewController设置为委托.然后我可以从我的视图控制器布局子视图,可以访问当前方向等等.