Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c self.view.bounds.size.width返回错误值_Objective C_Iphone_Bounds - Fatal编程技术网

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的发布文件。 尝试以下两种方法之一:

  • 在Xcode中,转到您的目标general,并在那里添加启动屏幕(“Main”)文件
  • 如果您使用的是资产目录,请转到LaunchImages资产目录,为两款新iPhone添加新的发布图像。您可能需要右键单击并选择“添加新启动映像”以查看添加新映像的位置
  • iPhone 6(Retina HD 4.7)需要一张750 x 1334的纵向发布图像。 iPhone 6 Plus(Retina HD 5.5)需要纵向和横向图像,大小分别为
    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
    }