我无法准确读取高度和宽度。所以我做了这个快速而肮脏的应用程序来测试情况。
这是代码:
@interface wwfpViewController ()
@property (nonatomic, strong) UIView * box;
@property (nonatomic, strong) UILabel * info;
@end
@implementation wwfpViewController
@synthesize box,info;
- (void)viewDidLoad {
[super viewDidLoad];
box=[[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
[box setBackgroundColor:[UIColor darkGrayColor]];
[box setAutoresizesSubviews:YES];
[box setAutoresizingMask:UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth];
info=[[UILabel alloc] initWithFrame:CGRectMake(10, 10, 300, 300)];
[info setTextColor:[UIColor whiteColor]];
[info setBackgroundColor:[UIColor blackColor]];
[info setLineBreakMode:NSLineBreakByWordWrapping];
[info setNumberOfLines:10];
[info setText:@"..."];
[self.view addSubview:box];
[box addSubview:info];
[self updateInfo];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(updateView:)
name:UIApplicationDidChangeStatusBarOrientationNotification
object:nil];
}
- (void) updateInfo {
CGFloat selfHeight=self.view.frame.size.height;
CGFloat selfWidth=self.view.frame.size.width;
CGFloat boxHeight=box.frame.size.height;
CGFloat boxWidth=box.frame.size.width;
int deviceOrientation=[[UIDevice currentDevice] orientation];
int statusOrientation=[[UIApplication sharedApplication] statusBarOrientation];
NSString * str=[NSString stringWithFormat:@"[height x width] \nself: [%f x %f] \nbox: [%f x %f] \ndevice: %d status: %d",selfHeight,selfWidth,boxHeight,boxWidth,deviceOrientation,statusOrientation];
[info setText:str];
}
- (void) updateView: (NSNotification*) notify {
[self updateInfo];
}
@end
当我在 iPad 上测试时,最初是纵向模式,信息标签报告以下内容:
[height x width]
self: [1004.000000 x 768.000000]
box: [1004.000000 x 768.000000]
device: 0 status: 1
这是对的!
然后当我将 iPad 旋转到横向时,我得到以下读数:
[height x width]
self: [768.000000 x 1004.000000]
box: [1004.000000 x 768.000000]
device: 3 status: 3
实际高度 x 宽度:748 x 1024
但是当我在 iPad 上进行横向测试时,信息标签会报告:
[height x width]
self: [1024.000000 x 748.000000]
box: [1024.000000 x 748.000000]
device: 0 status: 3
实际高度 x 宽度:748 x 1024
然后,当我将 iPad 旋转到纵向时,我得到以下读数:
[height x width]
self: [748.000000 x 1024.000000]
box: [748.000000 x 1024.000000]
device: 1 status: 1
实际高度 x 宽度:1004 x 768
我将其旋转回横向,然后得到以下读数:
[height x width]
self: [768.000000 x 1004.000000]
box: [1004.000000 x 768.000000]
device: 3 status: 3
实际高度 x 宽度:748 x 1024
在所有情况下,box
UIView 都会覆盖整个屏幕,因此它会自动调整正确的方向变化。这些结果与模拟器和实际 iPad 上的测试结果一致,我在 iPhone 上也有类似的体验。
在此之后,我有几个问题:
- 我究竟做错了什么?
- 当两者看起来相同时,为什么高度和宽度与高度和宽度
self.view
不同?box
无论方向如何变化,如何准确获取屏幕或视图的整体高度和宽度。
- 因为
[UIDevice ... orientation]
第一次使用时报告为零,所以我应该完全忽略它并坚持使用[UIApplication ... statusBarOrientation]
吗?