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

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

旋转回纵向时也会发生此问题:

我该如何解决? ,谢谢。

最佳答案

您可以使用 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)您具有新方向的坐标(并且由于导航控制器在风景v纵向中的高度不同,尽管这很重要,但是也许不是您的情况);巧合的是(b)您补救了一些可能会导致意外调整大小的自动调整蒙版的调整。

就个人而言,我已经开始在iOS 5和更高版本中的viewWillLayoutSubviews中以及在iOS早期版本中的didRotateFromInterfaceOrientationviewWillAppear中重置帧(我在代码中以编程方式完成了所有操作)。 iOS 5的viewWillLayoutSubviews替代方法比较优越,因为它可以在旋转动画之前设置帧,并使用旋转动画为帧的变化设置动画,这是非常细微的变化,但是非常光滑。一旦开始注意到可以正确执行此操作的应用程序,您将始终希望采用这种方式。

10-07 19:56
查看更多