我正在创建一个 iOS 应用程序。它在导航 Controller 中运行。在我最近构建的 View 中,UITextViews
和 UIImageView
在错误的坐标处显示不正确。我相信这可能是由于 UINavigationBar
.
当我在 Interface Builder 中设置 View 以反射(reflect)该 View 时,它实际上
错误地显示 View 。我再次假设这是由于 UINavigationBar
.我设法通过更改 Interface Builder 坐标来“修复”这个问题,直到它正确显示。这是 Interface Builder 现在的样子:
我希望 View 可以在两种设备方向(纵向和横向)下工作。 View 中的对象不容易被告知旋转,所以我以编程方式定位 View 。代码如下:
-(void) adjustViewsForOrientation:(UIInterfaceOrientation)orientation {
if (orientation == UIInterfaceOrientationPortrait) {
appInfo.frame = CGRectMake(20, 19, 280, 90);
updateInfo.frame = CGRectMake(20, 117, 280, 86);
authorInfo.frame = CGRectMake(20, 229, 172, 200);
authorImage.frame = CGRectMake(190, 274, 110, 110);
}
else if (orientation == UIInterfaceOrientationLandscapeLeft || orientation == UIInterfaceOrientationLandscapeRight) {
appInfo.frame = CGRectMake(11, 44, 199, 124);
updateInfo.frame = CGRectMake(218, 53, 242, 124);
authorInfo.frame = CGRectMake(11, 180, 340, 90);
authorImage.frame = CGRectMake(350, 170, 110, 110);
}
}
-(void) willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self adjustViewsForOrientation:toInterfaceOrientation];
}
-(void) viewWillAppear:(BOOL)animated {
[self adjustViewsForOrientation:self.interfaceOrientation];
[super viewWillAppear:animated];
}
这是我的主要问题:
当 View 旋转到横向时,对象不能直接定位。它们不遵循旋转期间要调用的坐标中描述的内容。
旋转回纵向时也会出现此问题:
我该如何解决这个问题? 先感谢您。
最佳答案
你可以用 sizeWithFont:constrainedToSize
做一些复杂的事情。找出各种文本框需要在新宽度下的大小以适合您要放入其中的文本,但可能更简单的是消除 UILabel/UITextView 和 UIImageView,然后创建一个 UIWebView
填充整个 View 并使用它的 loadHTMLString:baseURL
提供一个 HTML 字符串,其中包含您的副本和您捆绑包中图像的链接。
更新:
问题是您(a)您显然设置了 autoResizingMasks ; (b) 您设置新框架的时间过早(因此一旦发生重新定向,autoResizingMask 会再次调整它们)。
所以,有几个想法:
首先,您可能在 Interface Builder 中打开了自动调整大小的蒙版,例如就像是:
因此,关闭自动调整大小的蒙版:
其次,虽然我确信你会在 IB 中这样做,但仅供引用,你也可以通过编程方式将其关闭:
appInfo.autoresizingMask = 0;
updateInfo.autoresizingMask = 0;
authorInfo.autoresizingMask = 0;
authorImage.autoresizingMask = 0;
第三,您可能希望在自动调整大小有机会搞砸您的控件后更改框架坐标。通常,我会看到将这种帧调整推迟到
didRotateFromInterfaceOrientation
的人。而不是 willRotateToInterfaceOrientation
因为(a)你有新方向的坐标(并且因为导航 Controller 在横向和纵向中的高度不同,这可能很重要,尽管在你的情况下可能不是);巧合的是(b)您纠正了一些意外的自动调整大小蒙版可能引入的任何调整。就个人而言,我已经开始在
viewWillLayoutSubviews
中重置我的框架。在 iOS 5 及更高版本以及 didRotateFromInterfaceOrientation
中和 viewWillAppear
在早期版本的 iOS 中(我在我的代码中以编程方式完成所有这些工作)。 viewWillLayoutSubviews
的 iOS 5 替代品之所以优越,是因为它在旋转动画之前设置帧,并通过旋转动画对帧的变化进行动画处理,这是非常微妙的变化,但非常流畅。一旦您开始注意到可以正确执行此操作的应用程序,您将始终希望这样做。
关于objective-c - 对象在 View 中和设备方向更改后位置不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10842619/