iPad上方向更改后错误定位

时间:2011-01-14 14:21:49

标签: objective-c animation orientation landscape portrait

在更改iPadd应用程序的方向时遇到一些问题 我编写了一个功能,用于显示我的子视图,以便在视图显示或旋转时调用它 当“viewWillAppear”函数调用该函数时,该函数可以正常工作。但是当“willAnimateRotationToInterfaceOrientation”函数调用我的布局函数(“setPositionsForOrientation”)时,我面临以下问题:

  • 从纵向更改为横向时,左侧有128px的偏移量
  • 从横向更改为肖像时,左侧有负偏移

我的印象是,新的框架属性不能正确处理,因为我的UIScrollViews也应该调整大小,但他们不会这样做。

这就是我写的代码:

- (void)viewWillAppear:(BOOL)animated{
 [self setPositionsForOrientation:self.interfaceOrientation];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
 return YES;
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)newInterfaceOrientation duration:(NSTimeInterval)duration {
 [self setPositionsForOrientation:newInterfaceOrientation];
}

- (void)setPositionsForOrientation:(UIInterfaceOrientation)interfaceOrientation {
 // Position the UI elements for landscape mode
 if (interfaceOrientation == UIInterfaceOrientationLandscapeLeft || interfaceOrientation == UIInterfaceOrientationLandscapeRight) {
  self.view.frame = CGRectMake(0, 0, 1024, 748);
  self.menubarImage.frame = CGRectMake(0, 0, 1024, 121);
  self.backgroundImage.frame = CGRectMake(0, 0, 1024, 748);
  self.mainCategories.frame = CGRectMake(6, 6, 1012, 55);
  self.subCategories.frame = CGRectMake(58, 79, 960, 30);
  self.moviesContainer.frame = CGRectMake(6, 204, 1012, 456);
  self.searchButton.frame = CGRectMake(935, 709, 80, 30);
 }
 // Position the UI elements for portrait mode
 else {
  self.view.frame = CGRectMake(0, 0, 768, 1004);
  self.menubarImage.frame = CGRectMake(0, 256, 768, 121);
  self.toolbarImage.frame = CGRectMake(0, 924, 768, 80);
  self.backgroundImage.frame = CGRectMake(0, 256, 768, 748);
  self.mainCategories.frame = CGRectMake(6, 262, 756, 55);
  self.subCategories.frame = CGRectMake(58, 335, 704, 30);
  self.moviesContainer.frame = CGRectMake(6, 460, 756, 456);
  self.searchButton.frame = CGRectMake(680, 963, 80, 30);
 }
}

这里有一些图片来说明我的问题..

IB中的布局(所有子视图都将contentMode设置为左上角)

http://www.abload.de/image.php?img=interfacebuilderl9ey.png 

肖像模式显示正确/奇怪

http://www.abload.de/image.php?img=portrait_oklxf1.png
http://www.abload.de/image.php?img=portrait_failma8y.png

正确显示风景模式/奇怪

http://www.abload.de/image.php?img=landscape_ok4z2l.png
http://www.abload.de/image.php?img=landscape_failvzuy.png

我做错了什么,更重要的是,我该如何解决? 我发现this帖子描述了通常的方法,但我不知道如何覆盖我的视图“layoutSubviews”方法,因为视图只是我的UIViewController的属性..

2 个答案:

答案 0 :(得分:0)

如果你想创建自己的UIView子类并将其设置为UIViewController,那么你可以实现layoutSubviews方法,实际上非常简单!。

UIViewController不会创建一个视图,它希望用户设置视图,但在使用Interface BUilder时,已经为我们设置了UIView。

要更改视图,请执行以下操作:

  • 创建你的子类,在这里我假设它被称为MyView,并把你所有的UI东西(工具栏,按钮等)放在那里。
  • 在IB(* .xib)
  • 中打开视图控制器文件
  • 选择视图(我们正在更改的视图)
  • 转到Identity Inspector(或按Cmd + 4)
  • 在班级标识字段中输入“MyView”

由于您将所有UI元素都放在视图中作为ivar,您无法再从UIViewController访问它们了吗?因此,请确保您具有正确的访问器/属性和方法,以便从UIViewController处理您的视图(及其ivars)。 ;)

alt text

祝你好运;)

编辑:2011/01/17

当你在你的控制器中并且[self.view xyz]时,你会收到警告吗? 这是因为UIViewController的视图被声明为UIView对象。你将UIView子类化并在IB中设置它。因此,每次访问视图时都必须进行转换,否则编译器会认为它仍然是普通的UIView,它没有你在MyView中声明的方法。这样做:

[(MyView *)self.view xyz]; //and for that don't forget to #import "MyView.h"

这应该有效。但我不明白为什么然后得到:“属性'视图'类型不匹配超类'UIViewController'属性类型”首先尝试我刚才说的;)你确定你声明MyView为:

@interface MyView: UIView{
...
}
@property (...) XYZ *xyz;
...
@end

答案 1 :(得分:0)

我在.m文件的MyView类中添加了以下代码,它帮助我摆脱了痛苦:

- (void)awakeFromNib
{
    self.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}