获取相对于当前方向的视图框架大小

Posted

技术标签:

【中文标题】获取相对于当前方向的视图框架大小【英文标题】:Getting the view frame size with respect to current Orientation 【发布时间】:2013-03-10 22:28:54 【问题描述】:

如果我的应用同时支持纵向和横向模式并且我以横向模式启动我的应用,我会看到 UIViewController 的视图框架大小仍然是 viewDidAppear 中纵向的尺寸。 (例如:768x1024 而不是 748x1024)

当我创建和显示 viewController 时,我看到事件按此顺序出现:

shouldAutorotateToInterfaceOrientation // viewcontroller hasn't received rotate event yet
viewWillLayoutSubviews
viewDidLoad
shouldAutorotateToInterfaceOrientation // viewController now asked to change orientation
viewDidAppear
viewWillLayoutSubviews

通过这些事件序列,视图的帧大小仍然是纵向的(尽管边界是正确的)。

什么时候可以正确设置视图的框架?

【问题讨论】:

【参考方案1】:

您必须使用Cocoa Auto Layout system 来定义用户界面元素的布局约束。约束表示用户界面元素之间的关系,例如“这些视图从头到尾排列”或“此按钮应与此拆分视图子视图一起移动”。在布局用户界面时,约束满足系统以最接近约束的方式排列元素。

关注this video了解更多详情

【讨论】:

【参考方案2】:

框架不会旋转,只有当您旋转设备时框架内的边界才会旋转。检查使用:

self.view.bounds 

当你旋转设备时,你会看到它发生了变化。

您需要阅读 View Programming 指南:

http://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/WindowsandViews/WindowsandViews.html#//apple_ref/doc/uid/TP40009503-CH2-SW6

这是基本的。

【讨论】:

这不是真的。我有同样的问题,并且 bounds 和 frame 都给了我相同的值NSLog(@"%@", NSStringFromCGRect(self.view.bounds)); NSLog(@"%@", NSStringFromCGRect(self.view.frame)); 0, 0, 768, 975 0, 0, 768, 975 此外,View 编程指南中没有任何内容支持您的主张。 @andrew 我建议您花时间阅读我在回答中的链接。 我想从那里得到一个报价,请验证您的陈述。这里我先来:The size of the bounds rectangle is coupled to the size of the frame rectangle, so that changes to one affect the other.developer.apple.com/library/ios/documentation/UIKit/Reference/… 那个特别是在 UIDeviceOrientationChanged 通知上。附言在那种特殊情况下,我有一个标签栏,因此高度较小。 将您的 NSLog 放入 - (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation 。你得到了什么?

以上是关于获取相对于当前方向的视图框架大小的主要内容,如果未能解决你的问题,请参考以下文章

UIView 框架、边界和中心

一个iOS约束布局的小技巧

一个iOS约束布局的小技巧

使用 iOS 6 Auto Layout 相对于 superview 的大小定位视图

旋转UIView并使其更改视图大小以适应相对于旋转的空间

找出子视图相对于视图的位置