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

时间:2015-02-11 06:47:51

标签: objective-c iphone bounds

我现在面临一个非常奇怪的问题。始终[[self view] bounds].size.width 320根据设备不会改变320.000000。 iPhone 5,6& 6加上所有方法的所有方法都返回- (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

输出

{{1}}

即使是闪屏也在那里。

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

12 个答案:

答案 0 :(得分:13)

使用

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

而不是

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

它给你预期w / h。

答案 1 :(得分:9)

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

- (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

答案 2 :(得分:4)

有时您只需要在主题上执行此类操作。

对我来说,

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

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

答案 3 :(得分:3)

当您错过iPhone 6和6 Plus的启动文件时,就会发生这种情况。 尝试以下两种方法之一:

  1. 在Xcode中,转到目标,常规并在那里添加启动屏幕(" Main")文件。
  2. 如果您使用的是资产目录,请转到LaunchImages资产目录,然后为这两个新iPhone添加新的启动图像。您可能需要右键单击并选择"添加新的启动图像"查看添加新图像的地方。
  3. iPhone 6(Retina HD 4.7)需要750 x 1334的纵向启动图像。 iPhone 6 Plus(Retina HD 5.5)需要分别为1242 x 22082208 x 1242的纵向和横向图像。

答案 4 :(得分:3)

请改用- (void)viewWillLayoutSubviews。 看看这个:Managing View Layout

答案 5 :(得分:2)

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

答案 6 :(得分:2)

Use **viewDidLayoutSubviews** method

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

答案 7 :(得分:0)

您是否可以通过简单地创建一个新的测试项目并在viewDidLoad的{​​{1}}方法中写下三个日志语句来进行测试,就像这样 -

ViewController

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

示例输出 -

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

答案 8 :(得分:0)

我也面临着你遇到的同样问题。我认为你的viewcontroller是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);
}

答案 9 :(得分:0)

将相关任务查看到viewWillLayoutSubviews()方法

 override func viewWillLayoutSubviews() {
    print("view Size: \(view.bounds.width)")
}

答案 10 :(得分:0)

出于几个原因,您最好依赖Screen界限。他们会为不同的设备返回准确的值。

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

答案 11 :(得分:0)

使用:

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