我需要在旋转iPhone时对图层进行调整,但前提是它从纵向旋转到横向,反之亦然。如果它从landscapeLeft 180度旋转到landscapeRight,或从纵向180度旋转到portraitUpsideDown,我不需要做任何事情。
因此,为了避免不必要的操作,我运行这样的测试(self
是视图控制器):
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
BOOL bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
BOOL bToPortrait = UIInterfaceOrientationIsPortrait(interfaceOrientation);
if (bFromPortrait != bToPortrait)
// make adjustments
}
哪个不起作用,因为在调用willAnimate
时,self.interfaceOrientation
已经被更改以反映新方向,因此bFromPortrait和bToPortrait始终相同且调整永远不会发生。
所以我尝试从willRotate
运行此代码,此时“interfaceOrientation属性仍包含视图的原始方向。”但此时图层的主机视图的自动调整尚未进行,所以我有无法访问自动调整大小的帧,它将具有目标方向,没有它我无法进行调整。
所以我添加了一个布尔属性bFromPortrait
,以便跟踪iPhone的来源,在willRotate
中设置,并在willAnimate
中访问它(这有效) :
- (void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
self.bFromPortrait = UIInterfaceOrientationIsPortrait(self.interfaceOrientation);
}
- (void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
BOOL bToPortrait = UIInterfaceOrientationIsPortrait(toInterfaceOrientation);
if (self.bFromPortrait != bToPortrait)
// Make adjustments.
}
但我注意到,如果我覆盖didRotateFromInterfaceOrientation
,其fromInterfaceOrientation
arg正确反映了iPhone的来源,即使此方法在之后被称为。 因此不需要额外的布尔属性bFromPortrait
; UIViewController已经跟踪了这些信息 - 但在哪里?我如何访问它?
(你可能会问,为什么不在didRotateFromInterfaceOrientation
进行调整。问题是这个方法在动画之后运行,因此调整会动画。为了让调整包含在动画中,他们必须发生在willAnimate
。)
答案 0 :(得分:1)
你可能会过度思考这一点:)
我有类似的问题;这是我用来解决问题的代码:
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration
{
CGSize size = self.view.frame.size;
CGRect rect;
if (UIInterfaceOrientationIsLandscape(interfaceOrientation))
{
rect = CGRectMake(0, 0, size.height, size.width);
}
else
{
rect = CGRectMake(0, 0, size.width, size.height);
}
// Views that need updating
clockFaceView.frame = rect;
hourIndicatorView.frame = rect;
minuteIndicatorView.frame = rect;
// Update viewControllers
[timeInWordsOverlayController updateBoundsWithRect:rect];
[actionOveralyViewController updateBoundsWithRect:rect];
}
其中updateBoundsWithRect
定义为:
- (void) updateBoundsWithRect:(CGRect)rect
{
_actionView.frame = rect;
self.view.frame = rect;
}
您下载免费应用程序并查看代码的结果。 iTunes链接。 希望这会有所帮助。