我现在面临一个非常奇怪的问题。得到[[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);
}
产量
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);
它给你预期w / h。
将相关任务查看到viewWillLayoutSubviews()方法中
override func viewWillLayoutSubviews() {
print("view Size: \(view.bounds.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);
}
如果您尝试在[[self view] bounds].size.width
中阅读-(void) viewWillAppear:(BOOL)animated
value,您将看到它将显示正确的值。
在- (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
有时您只需要在主线程上执行此类操作。
为了我,
DispatchQueue.main.async {
//access to the frame/bounds
}
然后工作直接访问框架/绑定。
当你错过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
的纵向和横向图像。
请改用use- (void)viewWillLayoutSubviews
。看看这个:Managing View Layout
您必须为iPhone 6和iPhone 6 Plus添加适当大小的启动图像。否则这些设备将拉伸320点宽度到全屏。因此,您报告320为宽度。使用启动图像,您将获得475或414作为宽度报告。
Use **viewDidLayoutSubviews** method
override func viewDidLayoutSubviews() {
print("Size of View: \(view.bounds)")
}
你能不能通过简单地创建一个新的测试项目并在viewDidLoad
的ViewController
方法中写下三个日志语句来进行测试,就像这样 -
- (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}}
我也面临着你遇到的同样问题。我认为你的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);
}