无法在 iPad 上正确旋转翻译后的 UIView
Posted
技术标签:
【中文标题】无法在 iPad 上正确旋转翻译后的 UIView【英文标题】:Cannot properly rotate a translated UIView on the iPad 【发布时间】:2011-02-06 12:08:01 【问题描述】:我有一个UIViewController
,里面有两个 UIView,其布局(在 Interface Builder 中设置)是这样的(洋红色视图是 UIViewController 默认视图):
我将主视图添加到获得此效果的根视图中(通过不显示将其frame
放在底部的较暗视图):
现在当设备旋转时,我得到的是:
而我仍想隐藏较暗的视图。
这是我在它出现时用来隐藏它的代码(我在viewDidLoad
方法中使用它):
- (void)hideAll:(float)time
CGRect hiddenFrame = CGRectMake(0, 1024, self.view.frame.size.width, self.view.frame.size.height);
[self.view setFrame:hiddenFrame];
[self.view setNeedsDisplay];
它似乎可以工作,但是当我在旋转时(在willRotateToInterfaceOrientation:duration:
中)调用它的变体时,什么也没有发生:
CGRect hiddenFrame = CGRectMake(0, 748, self.view.frame.size.width, self.view.frame.size.height);
[self.view setFrame:hiddenFrame];
[self.view setNeedsDisplay];
我错过了什么?我需要在 Interface Builder 中设置一些其他视图属性吗?
更新
在我看来,设备旋转后坐标系并没有改变(即在纵向模式下设置在左上角的原点将在横向模式下顺时针旋转后变为右上角)
【问题讨论】:
【参考方案1】:在 IB 中检查您的支柱和弹簧。可能当您自动旋转时,将您固定在屏幕顶部的支柱会将您的框架移回顶部。
尝试将您的代码添加到 didRotateToInterfaceOrientation 方法中,以便它可以在旋转发生后运行。
【讨论】:
我在 IB 中没有支柱,只有两个弹簧用于更暗的视图(所以我想问题不在于这里)。当我实现didRotateToInterfaceOrientation:
时,它改变了外观,但似乎坐标系没有改变,它仍然固定在旧角落。这种行为正确吗?
很遗憾,我手头没有 Mac,所以无法检查。但是,根据记忆,一旦调用了didRotateToInterfaceOrientation
,新坐标系就应该生效。因此,如果屏幕以前是 (0,0,1024,768),现在应该是 (0,0,768, 1024)。我想知道 self.view.frame.size.width / height 调用 - 这些实际上不应该是通过 [[UIScreen mainScreen] applicationFrame]
获得的屏幕尺寸和高度。
我想说的是,即使设备旋转后,原点角似乎仍然相同,即如果在纵向模式下,它是左上角,旋转 90 度后顺时针是右上角!【参考方案2】:
你为什么要改变框架来隐藏它,而不仅仅是
[self.view setHidden:YES];
第二件事是您应该尝试设置“自动调整大小”面板来处理方向更改,而不是通过更改视图的框架。
希望我理解正确。
沙尼
【讨论】:
我不需要隐藏整个视图,只需将其向下移动,以便只有上部可见(这样可以向上拖动) 【参考方案3】:我遇到的问题可以通过两种方式来面对(我希望这可以为将来的某人节省一些时间):
使用 UIViewcontroller(从 xib 加载)并且仅将其视图作为旋转视图,这是我最初尝试解决的问题。在这种情况下,当您想要隐藏它时,您必须以编程方式设置视图的框架,并且这样做您必须考虑控制器的坐标系保持不变并且不会旋转(即它始终源自同一个角落) 在现有的 UIViewcontroller 中使用 UIView(从 xib 加载),这样视图将自动旋转和调整大小,您不必在每次旋转时考虑正确的坐标值(这是迄今为止最简单的方式)【讨论】:
以上是关于无法在 iPad 上正确旋转翻译后的 UIView的主要内容,如果未能解决你的问题,请参考以下文章
在 iPad 上旋转 UITableView 后,UITableViewCell 附件未正确定位