objective-c - 对象在 View 中和设备方向更改后位置不正确

标签 objective-c ios cocoa-touch uinavigationbar uiinterfaceorientation

我正在创建一个 iOS 应用程序。它在导航 Controller 中运行。在我最近构建的 View 中,UITextViewsUIImageView在错误的坐标处显示不正确。我相信这可能是由于 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 中打开了自动调整大小的蒙版,例如就像是:

size inspector with auto resizing on

因此,关闭自动调整大小的蒙版:

size inspector with auto resizing off

其次,虽然我确信你会在 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/

相关文章:

ios - 试图理解为什么 AudioBuffer 的 mDataByteSize 属性正在改变

ios - 未调用委托(delegate)方法?

iPhone - viewDidLoad/viewDidAppear 中的 UIView 动画问题

swift - 将框架构建为 "Generic iOS Device"导致在使用框架的项目中使用未声明的类型

iphone - UITableview 中的 UItextView,自动更正气泡不可见

ios - 无需登录即可在 Google+ 上分享文本、图片和网址

objective-c - 是ThreadedCoreData示例(来自Apple)在主线程上创建NSManagedObjectContext吗?

iOS MagicalRecord 表格 View 的分组和排序。它们究竟是如何工作的?

iOS 按钮在自定义 View 中不起作用

ios - 我可以在 iTunes Connect 和 Xcode 中跳过 iPhone 应用程序的版本号吗?