是否可以检索 UIView 在横向模式下的框架,而设备/界面处于纵向模式?如果是这样,这是如何完成的?
3 回答
MrThys,你应该知道你的视图应该如何,无论是纵向还是横向模式。之后,您可以将它们定义为常量,如下所示:
#define myViewPortrait CGRectMake(0.0f, 0.0f, 768.0f,1024.0f)
#define myViewLandscape CGRectMake(0.0f, 0.0f, 1024.0f,768.0f)
然后,当您的设备改变方向时,您可以使用这些值。:)
并不真地。您知道屏幕的尺寸只会交换宽度和高度。但是,如果状态栏可见,则可用区域会有所不同(例如,iPhone 上的纵向 320x460 与横向 300x480),然后如果您在 UINavigationController 或类似设备中,则必须考虑其 chrome,然后,如果您的视图不是容器视图控制器中视图控制器的顶级视图,则您还必须考虑各种自动调整大小掩码和任何自定义布局代码。
为什么你甚至需要这个?通常,您应该只响应您在 UIViewControllerwillRotateToInterfaceOrientation:duration:
或 UIView中给出的大小layoutSubviews
。
我不知道这样做的可靠方法。在我使用的一个项目中UIApplicationWillChangeStatusBarOrientationNotification
。根据视图是否被另一个视图覆盖(也可能存在其他破坏情况),查询视图的其中一个frame
或属性会返回不一致的结果。bounds
也许方法内部的情况不同willRotateToInterfaceOrientation:
。
就我而言,我最终实现了自己的方法来找出视图边界:
- (CGSize)currentViewSizeWithOrientation:(UIInterfaceOrientation)orient
{
CGSize size = self.currentView.bounds.size;
CGSize result;
if (UIInterfaceOrientationIsPortrait(orient))
result = CGSizeMake(fminf(size.width, size.height),
fmaxf(size.width, size.height));
else
result = CGSizeMake(fmaxf(size.width, size.height),
fminf(size.width, size.height));
return result;
}
在您的情况下,您可以尝试从 Nib 加载视图框架后找出它。然后,要么推断框架将在横向方向上是什么,要么在 Interface Builder 中显式设置框架并在两个方向的代码中复制它。