我有一个非常简单的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
报告它的实际尺寸?
答案 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;
}