在更改iPadd应用程序的方向时遇到一些问题 我编写了一个功能,用于显示我的子视图,以便在视图显示或旋转时调用它 当“viewWillAppear”函数调用该函数时,该函数可以正常工作。但是当“willAnimateRotationToInterfaceOrientation”函数调用我的布局函数(“setPositionsForOrientation”)时,我面临以下问题:
我的印象是,新的框架属性不能正确处理,因为我的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的属性..
答案 0 :(得分:0)
如果你想创建自己的UIView子类并将其设置为UIViewController,那么你可以实现layoutSubviews方法,实际上非常简单!。
UIViewController不会创建一个视图,它希望用户设置视图,但在使用Interface BUilder时,已经为我们设置了UIView。
要更改视图,请执行以下操作:
由于您将所有UI元素都放在视图中作为ivar,您无法再从UIViewController访问它们了吗?因此,请确保您具有正确的访问器/属性和方法,以便从UIViewController处理您的视图(及其ivars)。 ;)
祝你好运;)
编辑: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;
}