UIScrollView没有在方向更改上获得新的大小

时间:2010-07-11 01:05:25

标签: ipad uiscrollview orientation ios

我有一个非常简单的UIScrollView示例,它根本就没有做到它应该做的事情。 不确定这是API的错误还是代码中的错误。

基本上,我有UIViewController UIScrollView的视图。 当我将其添加到UIWindow并更改iPad的方向时,我会退出UIScrollView的大小,这是错误的(?)报告的。

这是我的UIViewController实施:

@implementation CustomViewController
- (void)loadView {
  scrollView = [[[UIScrollView alloc] init] autorelease];
  scrollView.delegate = self;
  scrollView.backgroundColor = [UIColor redColor];
  self.view = scrollView;
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
  CGSize rect = scrollView.frame.size;
  NSLog(@"will rotate w%f h%f", rect.width, rect.height);
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
  CGSize rect = scrollView.frame.size;
  NSLog(@"will animate rotation w%f h%f", rect.width, rect.height);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
  CGSize rect = scrollView.frame.size;
  NSLog(@"did rotate w%f h%f", rect.width, rect.height);
}

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

@end

当我运行上面的代码时,我在控制台中看到以下条目:

2010-07-11 11:03:05.214 Untitled2[6682:207] will rotate w768.000000 h1004.000000
2010-07-11 11:03:05.214 Untitled2[6682:207] will animate rotation w748.000000 h1024.000000
2010-07-11 11:03:05.619 Untitled2[6682:207] did rotate w748.000000 h1024.000000
2010-07-11 11:03:07.951 Untitled2[6682:207] will rotate w748.000000 h1024.000000
2010-07-11 11:03:07.958 Untitled2[6682:207] will animate rotation w768.000000 h1004.000000
2010-07-11 11:03:08.367 Untitled2[6682:207] did rotate w768.000000 h1004.000000

如您所见,方向更改会调整UIScrollView的大小,但仅限于允许新的状态栏。 我希望宽度和高度发生巨大变化,因为UIScrollView的宽度和宽度都高,反之亦然。

有没有办法让UIScrollView报告它的实际尺寸?

5 个答案:

答案 0 :(得分:4)

如果你还在寻找,我有答案。测试界限,而不是框架。

原因:frame是边界的派生属性和应用于旋转的变换。

答案 1 :(得分:2)

当他们的超级视图调整大小时,视图不会自动调整大小,除非您专门设置它们。对于该滚动视图,您需要告诉它在超视图时调整其宽度和高度。

scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

答案 2 :(得分:2)

我注意到如果你开始使用iPhone NIB文件而不是专用的iPad NIB文件,那么确定contentSize中的新didRotateFromInterfaceOrientation也是不可能的:iPhone NIB文件中的帧很多当你实际上在iPad上时,内容的计算高度变得更小。 Apple DID说我必须创建一个单独的iPad NIB文件......

所以,我也得到didRotateFromInterfaceOrientation中的旧维度,但对我来说现在这不是问题,因为一旦我开始使用正确的NIB文件,iOS确实可以处理所有问题。尽管如此,在didRotateFromInterfaceOrientation方法中,对于当前视图,帧尺寸不正确似乎不那么直观。

PS。我最终找到了一个解决方案,只使用通知代替didRotateFromInterfaceOrientation

[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(orientationChanged:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];

然后在orientationChanged方法中,将视图调整为新帧。我有一个最后的问题:如果初始方向与笔尖中的方向不同,视图仍然是错误的,我通过创建新的NIB文件解决了这个问题,特别是对于横向视图。在init方法中,ViewController根据当前方向选择加载哪个NIB。

答案 3 :(得分:0)

我通常会通过将contentSize的一个值设置为0来解决此问题,例如CGSizeMake(contentSize.width, 0)用于水平视图。

强制UIScrollView仅滚动,例如contentSize的水平集不可滚动值为0> CGSizeMake(contentSize.width, 0)

我希望它有所帮助。

答案 4 :(得分:0)

我不知道它对你有所帮助,因为我从未测试过这个,但我认为它可能对你有帮助

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
self.view = scrollView;
CGSize rect = scrollView.frame.size;
NSLog(@"will rotate w%f h%f", rect.width, rect.height);
}

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
self.view = scrollView;    
CGSize rect = scrollView.frame.size;
NSLog(@"will animate rotation w%f h%f", rect.width, rect.height);
}

- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
 self.view = scrollView;
 CGSize rect = scrollView.frame.size;
 NSLog(@"did rotate w%f h%f", rect.width, rect.height);
}

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