我有自己的自定义UIViewController,它包含一个带有UIImageView的UIScrollView作为子视图。我希望在设备方向改变时使图像自动旋转,但它似乎不起作用......
在头文件中,我有;
@interface MyViewController : UIViewController <UIScrollViewDelegate> {
IBOutlet UIScrollView *containerView;
UIImageView *imageView;
}
这些组件在loadView函数中初始化,如下所示;
containerView = [[UIScrollView alloc] initWithFrame:frame];
NSData *data = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://..."]];
UIImage *image = [[UIImage alloc] initWithData:data];
imageView = [[UIImageView alloc] initWithImage:image];
[image release];
[containerView addSubview:imageView];
我已经添加了以下方法,假设我需要使视图自动旋转......
-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
}
MyViewController加载了我指定要从URL抓取的图像,并且当我翻转设备时,正在使用正确的UIInterfaceOrientation调用shouldAutorotate ...函数。
然而,didRotateFromInterfaceOrientation方法没有被调用,并且图像似乎没有自己旋转... 有人可以指出我需要添加什么,或者我在这里做错了什么?
提前致谢!
答案 0 :(得分:26)
这对你来说可能不是正确的答案,因为你没有指定UIViewController的上下文,但我刚刚在Apple文档中发现了一个重要的问题,解释了我遇到的类似问题。
标签栏控制器支持纵向 默认情况下方向,不要 旋转到横向 除非所有的根视图 控制器支持这样的 取向。当设备方向 更改发生,标签栏控制器 查询其视图控制器数组。 如果其中任何一个不支持 方向,标签栏 控制器不会改变它 取向。强>
答案 1 :(得分:3)
我注意到旋转不是第一个或唯一视图的UIView作为主窗口的直接子项时存在问题。
因此,如果你的UIView是导航控制器或标签视图控制器的一部分,你还需要在导航控制器或标签视图控制器上覆盖shouldAutoRotateToInterfaceOrientation。
另外:如果/何时需要手动执行,使用[UIApplication setStatusBarOrientation]
有助于解决问题。
答案 2 :(得分:1)
为了使这种事情在我的应用程序中起作用,我不得不重写
- (void) didRotateFromInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
[self layoutSubviews];
}
以及layoutSubviews
- (void)layoutSubviews
{
NSLog(@"layoutSubviews called");
...recalc rects etc based on the new self.view.bounds...
}
我不确定这是绝对必要的,但它对我有用。
答案 3 :(得分:1)
有时,如果您向视图添加子视图,则您有责任确保将方法传递给子视图;几天前我写了short post这个。例如,如果您有UIViewController
并添加UINavigationController
作为子视图,则必须将此代码添加到UIViewController
,如果您希望在{{1}时调用viewWillAppear:animated:
}}出现:
UINavigationController.view
可能需要由superview调用-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[projectNavigationController viewWillAppear:animated];
}
和willRotateToInterfaceOrientation
方法;我对此并不十分确定,但试一试。
答案 4 :(得分:1)
这在Apple Technical Q&A QA1688中进行了讨论。
有时,如果您将多个视图叠加在一起由于某种原因,则anotherController可能不会收到旋转事件。
[myWindow addSubview:primaryViewController.view];
[myWindow addSubview:anotherController.view];
解决此问题的一种懒惰方式(不是一个好的设计)只在窗口上添加一个子视图,但在应用程序委托上初始化多个控制器。然后,当您需要切换窗口时,删除当前视图并添加所需的视图
[self.view removeFromSuperview];
AppDelegate *dg = (AppDelegate *)[[UIApplication sharedApplication] delegate];
[[dg window] addSubview:[[dg viewController] view]];
答案 5 :(得分:0)
它对我有用....我在这里添加这个的原因是为了让其他人更容易找到。我花了很多时间才找到这个问题:
创建一组UIViewController类型的新类文件,进入该类的.h文件并更改此行
@implementation MyTabBarController: UIViewController {}
@end
这样的事情
@implementation MyTabBarController: UITabBarController{
}
现在进入nib文件并单击UITabBarController对象并转到它的标识选项卡,并使其成为Class MyTabBarController。
现在在MyTabBarController.m中确保它在其中。
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)io {
return YES;
}
如果你愿意的话,你可以摆脱那里的一切。
答案 6 :(得分:0)
我刚遇到类似的问题。我有一系列视图控制器/复杂视图,它们完全旋转,无法弄清楚为什么我刚添加的新视图不旋转。经过大量的反复试验,原因是我在分配视图控制器时没有调用init方法(它是标准的init方法); 例如我在做什么
m_timerViewController = [TimerViewController alloc];
而不是
m_timerViewController = [[TimerViewController alloc] init];
答案 7 :(得分:0)
扩展jonoogle的帖子。我有类似的错误。我的视图有一个笔尖和我的自定义init:
- (id)initWithCategory:(Category *)category inManagedObjectContext:context{
没有包含对init nib的调用。
self = [super initWithNibName:nil bundle:nil];
添加该行使我的视图像预期的那样旋转。
答案 8 :(得分:0)
如果您要从横向旋转到肖像,请执行此操作!
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}