对象在视图中和设备方向更改后位置不正确

时间:2012-05-31 23:29:40

标签: objective-c ios cocoa-touch uinavigationbar uiinterfaceorientation

我正在创建一个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];
}

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

旋转回肖像时也会出现此问题:

我该如何解决?提前谢谢。

3 个答案:

答案 0 :(得分:3)

你可以使用sizeWithFont:constrainedToSize做一些复杂的事情,找出各种文本框需要在新宽度下的大小,以适合你想要放入其中的文本,但可能更容易消除UILabel / UITextView和UIImageView,只需创建一个填充整个视图的UIWebView,并使用它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)你有新方向的坐标(并且因为导航控制器在景观v中是不同的高度肖像,这可能很重要,但可能不是你的情况);并巧合地(b)你补救了一些非预期的自动化面具可能引入的任何调整。

就我个人而言,我已经尝试在iOS 5及更高版本的viewWillLayoutSubviews以及早期版本的iOS中的didRotateFromInterfaceOrientationviewWillAppear重置我的框架(我以编程方式完成所有这些在我的代码中)。 iOS {5}的另一种选择是优越的,因为它在旋转动画之前设置了帧,并使用旋转动画动画帧的变化,这是非常微妙的变化,但非常光滑。一旦你开始注意到这样做的应用程序,你总是希望这样做。

答案 1 :(得分:2)

调整adjustViewsForOrientation:来自willRotateToInterfaceOrientation:duration:call back。相反,将调用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];
}

答案 2 :(得分: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];