Objective c self.view.bounds.size.width返回错误值
我现在面临一个非常奇怪的问题。获取Objective c self.view.bounds.size.width返回错误值,objective-c,iphone,bounds,Objective C,Iphone,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 { [su
[[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
甚至启动屏幕也在那里
如何获得视图的实际大小?您可以简单地创建一个新的测试项目,并在
viewdiload
方法的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}}
2015-02-11 12:45:19.116测试[1558:87057]屏幕=(
""
)
2015-02-11 12:45:19.117测试[1558:87057]自帧={{0,0},{375667}
2015-02-11 12:45:19.117测试[1558:87057]self.view.frame={{0,0},{375667}
发生这种情况的原因是您丢失了iPhone 6和6 Plus的发布文件。
尝试以下两种方法之一:
1242 x 2208
和2208 x 1242
。
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
而不是
NSLog(@"%f", [[self view] bounds].size.width);
它为您提供了预期的w/h。您绝对有必要为iPhone 6和iPhone 6 Plus添加一个大小合适的发布图像。否则,这些设备会将320点的宽度扩展到全屏。因此,您可以将320报告为宽度。使用launch image,您将得到475或414报告宽度。我也面临与您相同的问题。我想你的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);
}
改用-(void)viewWillLayoutSubviews
。
看看这个:如果你试图阅读
[[self view]bounds].size.width
值在-(void)视图中会出现:(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
将相关任务查看到viewWillLayoutSubviews()方法中
出于几个原因,您最好依赖屏幕边界。它们会返回不同设备的精确值
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);
}
有时,您只需在主线程上执行此类操作即可 对我来说
DispatchQueue.main.async {
//access to the frame/bounds
}
然后直接访问帧/绑定。如果您的
视图.bounds.size.width
为320
,则视图的边界为320点宽。可能您的视图没有占据设备的全部宽度。@AaronBrager此视图是viewController的视图。因此,我不确定如何测量设备的全宽。它有点不清楚。你能粘贴一些代码吗?你用哪种方法检查屏幕大小?不,启动屏幕在那里。@TapasPal:然后添加一个!!默认情况下,Xcode提供“Main.storyboard”文件。试着像第一步提到的那样使用它。我没有使用故事板。Ho-ly-sh-t!!!这是个疯子!当我添加iphone6的启动屏幕时,一切都恢复了正常。这太奇怪了!!!谢谢你,伙计!是的,当然你必须避免通过图像源启动,并设置一个启动屏幕文件,然后你可以为每个设备获得正确的主屏幕边界。是的,它工作正常。但是为什么我的视图在每台设备上全屏显示时没有给出正确的值。我只是想知道,当我的视图在每台设备上全屏显示时,为什么它的宽度像静态320。?你可以在我的问题中看到,对于didLoad,willbeen,didlease,我使用这个。谢谢@icloud。你刚刚解决了我的问题。我试图在viewDidLoad中获取它如何在viewDidLoad@icould中获得正确的宽度?我有一个特例,我尝试了我所能做的一切:在ViewDidDisplay、LayoutSubView等中放置代码,但仍然收到错误的帧/边界值。但是您关于访问主线程中的值的建议为我解决了这个问题。谢谢@Hemang!很高兴知道这有帮助!非常感谢。我花了几个小时才意识到这一点。有文件记录吗?
- (void)viewDidLoad
{
[super viewDidLoad];
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.width);
NSLog(@"%f", [[UIScreen mainScreen] bounds].size.height);
}
DispatchQueue.main.async {
//access to the frame/bounds
}