我现在面临一个非常奇怪的问题。始终[[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}}
即使是闪屏也在那里。
如何获得视图的实际大小?
答案 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的启动文件时,就会发生这种情况。 尝试以下两种方法之一:
iPhone 6(Retina HD 4.7)需要750 x 1334
的纵向启动图像。
iPhone 6 Plus(Retina HD 5.5)需要分别为1242 x 2208
和2208 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);
}