self.view.bounds.size.width返回错误值



我现在面临一个非常奇怪的问题。得到[[self view] bounds].size.width总是320,它不会根据设备而改变。iPhone 5、6&6加上下面所有方法中的返回320.000000

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"%f", [[self view] bounds].size.width);
}
- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%f", [[self view] bounds].size.width);
}

输出

2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000 
2015-02-11 14:48:03.274 MyApp[2948:86285] 320.000000
2015-02-11 14:48:03.783 MyApp[2948:86285] 320.000000

甚至连启动屏幕也在那里。

如何获取视图的实际大小?

使用

NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);

而不是

NSLog(@"%f", [[self view] bounds].size.width);

它给出了u期望的w/h。

有时您所需要的只是在main线程上做这样的事情。

对我来说,

DispatchQueue.main.async {
    //access to the frame/bounds
}

然后直接访问框架/绑定。

如果您尝试读取-(void) viewWillAppear:(BOOL)animated中的[[self view] bounds].size.width值,您会发现它将显示正确的值。

- (void)viewDidLoad中,[[self view] bounds].size.width将向您展示您在.xib文件中的确切设计。

请参阅以下示例和NSLog结果。

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.
    NSLog(@"%f",[[self view] bounds].size.width);
}
-(void) viewWillAppear:(BOOL)animated{
    NSLog(@"%f",[[self view] bounds].size.width);
    [testIndicator startAnimatingInView:self.view];
}

结果分别为:

2016-02-17 19:00:47.519 xxxxx[16107:504629] 320.000000
2016-02-17 19:00:47.521 xxxxx[16107:504629] 414.000000

这是因为您错过了iPhone 6和6 Plus的启动文件。尝试以下两种方法之一:

  1. 在Xcode中,转到您的目标,常规并在那里添加启动屏幕("Main")文件
  2. 如果您正在使用资产目录,请转到LaunchImages资产目录,并为两款新iPhone添加新的启动图像。您可能需要右键单击并选择"添加新启动图像"以查看添加新图像的位置

iPhone 6(Retina HD 4.7)需要750 x 1334的人像启动图像。iPhone 6 Plus(Retina HD 5.5)需要分别大小为1242 x 22082208 x 1242的纵向和横向图像。

为iPhone 6和iPhone 6 Plus添加合适大小的发布图像是绝对必要的。否则,这些设备将把320点的宽度扩展到全屏。因此,您得到320报告为宽度。使用启动图像,您将获得475或414的宽度报告。

请改用- (void)viewWillLayoutSubviews。看看这个:管理视图布局

Use **viewDidLayoutSubviews** method
override func viewDidLayoutSubviews() {
    print("Size of View: (view.bounds)")
}

你能简单地创建一个新的测试项目并在ViewControllerviewDidLoad方法中写下以下三条日志语句来进行测试吗

- (void)viewDidLoad {
    NSLog(@"screens = %@", [UIScreen screens]);
    NSLog(@"self.frame= %@", NSStringFromCGRect([[UIScreen mainScreen] bounds]));
    NSLog(@"self.view.frame= %@", NSStringFromCGRect(self.view.frame));
}

构建并运行-您将获得设备/屏幕/视图的实际分辨率

样本输出-

2015-02-11 12:45:19.116 Test[1558:87057] screens = (
    "<UIScreen: 0x7ff0b970bcc0; bounds = {{0, 0}, {375, 667}}; mode = <UIScreenMode: 0x7ff0b961b500; size = 750.000000 x 1334.000000>>"
)
2015-02-11 12:45:19.117 Test[1558:87057] self.frame= {{0, 0}, {375, 667}}
2015-02-11 12:45:19.117 Test[1558:87057] self.view.frame= {{0, 0}, {375, 667}}

我也面临着与您相同的问题。我想你的遥控器是320宽。加载视图后,在一段延迟后调用一个方法,然后获取相应视图的框架或视图的边界。你得到了正确的框架。

-(void)viewDidLoad
{
    [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(getMyFrame) userInfo:nil repeats:NO];
    [super viewDidLoad];
}
-(void)getMyFrame
{
    NSLog(@"%f", [[self view] bounds].size.width);
}

出于以下几个原因,您应该更好地依赖Screen边界。他们会为不同的设备返回准确的值。

NSLog(@"Width: %f Height: %f"
      ,[[UIScreen mainScreen] bounds].size.width
      ,[[UIScreen mainScreen] bounds].size.height);

使用:

- (void)viewDidLoad 
{
    [super viewDidLoad];
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
    NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}

最新更新