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

Tap*_*Pal 15 iphone objective-c bounds

我现在面临一个非常奇怪的问题.获取[[self view] bounds].size.width总是320它不是根据设备改变.iPhone 5,6和6 Plus适用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);
}
Run Code Online (Sandbox Code Playgroud)

产量

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
Run Code Online (Sandbox Code Playgroud)

即使是闪屏也在那里.

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

Gaj*_*han 14

使用

NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
Run Code Online (Sandbox Code Playgroud)

代替

NSLog(@"%f", [[self view] bounds].size.width);
Run Code Online (Sandbox Code Playgroud)

它给你预期w/h.

  • 我只想知道我的视图在每个设备上全屏显示然后为什么它的宽度就像静态320. (3认同)

小智 9

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

In - (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];
}
Run Code Online (Sandbox Code Playgroud)

分别是:

2016-02-17 19:00:47.519 xxxxx[16107:504629] 320.000000
2016-02-17 19:00:47.521 xxxxx[16107:504629] 414.000000
Run Code Online (Sandbox Code Playgroud)


Hem*_*ang 5

有时,您所需要做的只是在线程上执行此类操作。

为了我,

DispatchQueue.main.async {
    //access to the frame/bounds
}
Run Code Online (Sandbox Code Playgroud)

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


San*_*ani -1

viewDidLoad您能否通过简单地创建一个新的测试项目并在的方法中编写以下三个日志语句来进行测试ViewController,如下所示 -

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

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

样本输出-

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}}
Run Code Online (Sandbox Code Playgroud)