【问题标题】:View Controller's View's properties视图控制器的视图属性
【发布时间】:2013-04-15 06:48:41
【问题描述】:

我正在开发专用计算器的界面,我在 IB 中有以下设置:

我使用了 IB 的“Container View”并将其设置为与我的自定义视图控制器“ButtonViewController”相同。

然后,在我的 ButtonViewController.m 文件中,我有以下内容:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor colorWithRed: 0.75 green: 0.0 blue: 0.0 alpha: 1.0 ];
    NSLog(@"self.view.bounds.size.width:\t%f", self.view.bounds.size.width);
    NSLog(@"self.view.bounds.size.height:\t%f", self.view.bounds.size.height);

    NSLog(@"self.view.frame.size.width:\t%f", self.view.frame.size.width);
    NSLog(@"self.view.frame.size.height:\t%f", self.view.frame.size.height);
}

我得到以下屏幕输出:

以及以下控制台输出:

self.view.bounds.size.width:    320.000000
self.view.bounds.size.height:   460.000000
self.view.frame.size.width:     320.000000
self.view.frame.size.height:    460.000000

Interface Builder 声明“容器”的宽度为 280 像素,高度为 364 像素,因此出于某种原因,我没有得到正确的值。

我什至试图找到superboundsframe 尺寸,但它们仍然是320x460。

谁能告诉我我做错了什么?

提前致谢

[更新]

只是为其他人提供的一些信息: 我已经使用类似的 UI 控件进行了一些测试,这就是我发现的: (cvObject 是一个 UICollectionView 对象)

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSLog(@"%s: self.cvObject.bounds:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.bounds));
    NSLog(@"%s: self.cvObject.frame:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.frame));
}

-(void)viewWillAppear:(BOOL)animated
{
    NSLog(@"%s: self.cvObject.bounds:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.bounds));
    NSLog(@"%s: self.cvObject.frame:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.frame));
}

- (void)viewDidAppear:(BOOL)animated
{
    NSLog(@"%s: self.cvObject.bounds:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.bounds));
    NSLog(@"%s: self.cvObject.frame:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.frame));
}

-(void)viewWillLayoutSubviews
{
    NSLog(@"%s: self.cvObject.bounds:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.bounds));
    NSLog(@"%s: self.cvObject.frame:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.frame));
}

-(void)viewDidLayoutSubviews
{
    NSLog(@"%s: self.cvObject.bounds:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.bounds));
    NSLog(@"%s: self.cvObject.frame:\t%@", __FUNCTION__, NSStringFromCGRect(self.cvObject.frame));
}

我得到的是:

-[FPViewController viewDidLoad]: self.cvObject.bounds:  {{0, 0}, {0, 0}}
-[FPViewController viewDidLoad]: self.cvObject.frame:   {{0, 0}, {0, 0}}
-[FPViewController viewWillAppear:]: self.cvObject.bounds:  {{0, 0}, {0, 0}}
-[FPViewController viewWillAppear:]: self.cvObject.frame:   {{0, 0}, {0, 0}}
-[FPViewController viewWillLayoutSubviews]: self.cvObject.bounds:   {{0, 0}, {0, 0}}
-[FPViewController viewWillLayoutSubviews]: self.cvObject.frame:    {{0, 0}, {0, 0}}
-[FPViewController viewDidLayoutSubviews]: self.cvObject.bounds:    {{0, 0}, {280, 312}}
-[FPViewController viewDidLayoutSubviews]: self.cvObject.frame: {{20, 128}, {280, 312}}
-[FPViewController viewDidAppear:]: self.cvObject.bounds:   {{0, 0}, {280, 312}}
-[FPViewController viewDidAppear:]: self.cvObject.frame:    {{20, 128}, {280, 312}}

因此您可以看到,只有在视图布置了其子视图之后,它才确定了对象的框架和边界。

【问题讨论】:

    标签: ios view uiviewcontroller frame bounds


    【解决方案1】:

    你应该重新检查viewDidAppear 中的这些值,你会发现你会在那里看到正确的值:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        self.view.backgroundColor = [UIColor colorWithRed: 0.75 green: 0.0 blue: 0.0 alpha: 1.0 ];
    
        // frame and bounds are not entirely reliable at this point
    
        NSLog(@"%s: self.view.bounds:\t%@", __FUNCTION__, NSStringFromCGRect(self.view.bounds));
        NSLog(@"%s: self.view.frame:\t%@", __FUNCTION__, NSStringFromCGRect(self.view.frame));
    }
    
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    
        // frame and bounds have generally been updated correctly by this point
    
        NSLog(@"%s: self.view.bounds:\t%@", __FUNCTION__, NSStringFromCGRect(self.view.bounds));
        NSLog(@"%s: self.view.frame:\t%@", __FUNCTION__, NSStringFromCGRect(self.view.frame));
    }
    

    【讨论】:

      猜你喜欢
      • 2012-04-02
      • 1970-01-01
      • 2017-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2013-09-30
      • 1970-01-01
      相关资源
      最近更新 更多