1

我正在创建一个 iOS 应用程序。它在导航控制器中运行。在我最近构建的视图中,UITextViewsUIImageView一直在错误的坐标处显示不正确。我相信这可能是由于UINavigationBar.

当我在 Interface Builder 中设置视图以镜像该视图时,它实际上错误地显示了视图。我再次假设这是由于UINavigationBar. 我设法通过更改 Interface Builder 坐标来“修复”这个问题,直到它正确显示。这是 Interface Builder 现在的样子:

我希望视图可以在两种设备方向(纵向和横向)下工作。视图中的对象不容易被告知旋转,所以我以编程方式定位视图。代码如下:

-(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];
}

这是我的主要问题: 当视图旋转为横向时,对象不能直接定位。它们不遵循旋转期间要调用的坐标中描述的内容。

旋转回纵向时也会出现此问题:

我该如何解决这个问题? 先感谢您。

4

3 回答 3

3

您可以做一些复杂的事情sizeWithFont:constrainedToSize来确定各种文本框需要在新宽度上的大小以适合您要放入其中的文本,但可能更容易的是消除 UILabel/UITextView 和 UIImageView,并且只需创建一个UIWebView填充整个视图并使用它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)你有新方向的坐标(并且因为导航控制器在横向和纵向中的高度不同,这可能很重要,尽管可能不是在你的情况下);巧合的是(b)您纠正了一些意外的自动调整大小蒙版可能引入的任何调整。

就个人而言,我已经开始viewWillLayoutSubviews在 iOS 5 及更高版本didRotateFromInterfaceOrientation以及viewWillAppear早期版本的 iOS 中重置我的框架(我在我的代码中以编程方式完成所有这些操作)。iOS 5 的替代方案viewWillLayoutSubviews更胜一筹,因为它在旋转动画之前设置帧,并通过旋转动画来动画帧的变化,这是非常微妙的变化,但非常流畅。一旦您开始注意到可以正确执行此操作的应用程序,您将始终希望这样做。

于 2012-06-01T03:31:57.063 回答
2

从 willRotateToInterfaceOrientation:duration: 回调中调用 adjustViewsForOrientation: 为时过早。相反,将对 adjustViewsForOrientation: 的调用移动到 willAnimateRotationToInterfaceOrientation:duration: 回调中。从文档中:

By the time this method is called, the interfaceOrientation property is already set to the new orientation, and the bounds of the view have been changed. Thus, you can perform any additional layout required by your views in this method.

UIViewController willAnimateRotationToInterfaceOrientation:duration:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation duration:(NSTimeInterval)duration {
   [self adjustViewsForOrientation:toInterfaceOrientation];
}
于 2012-06-02T14:43:01.790 回答
1

正如在其他地方的评论中所讨论的那样,虽然创建单独的控件并在方向更改时移动它们可以为您提供很好的控制水平,但更简单的方法是只创建一个 UIWebView 控件,并让它负责利用重新格式化文本对于更宽的屏幕。此外,UIWebView 可以轻松格式化文本(粗体、斜体)或添加超链接(尤其是电子邮件地址和电话号码。无论如何,这里是为 UIWebView 创建 HTML 字符串的示例:

- (NSString *)htmlString
{
    NSURL *imgUrl = [[NSBundle mainBundle] URLForResource:@"IMG_0999" withExtension:@"PNG"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    NSString *htmlBodyTemplate = 
        @"<html>"
        @"<style type=\"text/css\">"
        @"html {"
        @"    -webkit-text-size-adjust: none; /* Never autoresize text */"
        @"}"
        @"</style>"
        @"<body style=\"font-family:Verdana, Geneva, sans-serif; font-size:14px;\">"

        @"<p>This application is version %@. The recommended iOS version for running this application is iOS 5.0+. The minimum iOS version is iOS 4.3.</p>"
        @"<p>This application will automatically check for updates at startup. It is recommended to immediately update the app when prompted.</p>"
        @"<img src=\"%@\" style=\"float:right;\" width=\"150px\" />"
        @"<p>This application was created by Ridgefield High School student <strong>Devin Gund</strong> in 2012. He worked with the Ridgefield Public Schools technology department in publishing this application.</p>"

        @"</body>"
        @"</html>";

    return [NSString stringWithFormat:htmlBodyTemplate, version, [imgUrl relativeString]];
}

然后,在您的 viewDidLoad 中,包含一行:

[self.webView loadHTMLString:[self htmlString] baseURL:nil];
于 2012-06-03T14:43:17.677 回答