Ios 获取子视图';故事板中的框架

Ios 获取子视图';故事板中的框架,ios,xcode,uistoryboard,Ios,Xcode,Uistoryboard,我只想(现在)在视图控制器的实例化上获取子视图的维度 [这是我能找到的最简单的一个例子。我试图弄清楚为什么故事板中的场景子视图的行为不符合我的预期,也就是说:像XIB一样,我只想在任何东西真正被绘制到屏幕之前获得子视图的尺寸] 为了将问题归结为一个新的、干净的项目,我这样做: 创建一个新的单视图项目,选中“使用情节提要” 将单个UIView添加到现有默认的MainStoryboard\u iPad.storyboard(并将其背景更改为绿色以使其更易于查看-除了缩小一些尺寸之外,这是我从拖动到

我只想(现在)在视图控制器的实例化上获取子视图的维度

[这是我能找到的最简单的一个例子。我试图弄清楚为什么故事板中的场景子视图的行为不符合我的预期,也就是说:像XIB一样,我只想在任何东西真正被绘制到屏幕之前获得子视图的尺寸]

为了将问题归结为一个新的、干净的项目,我这样做:

  • 创建一个新的单视图项目,选中“使用情节提要”
  • 将单个UIView添加到现有默认的
    MainStoryboard\u iPad.storyboard
    (并将其背景更改为绿色以使其更易于查看-除了缩小一些尺寸之外,这是我从拖动到场景上的默认UIView所做的唯一更改)
  • 选项单击导航器中的
    ViewController.h
    文件,将其放在情节提要框架下自己的框架中,并在
    @interface
    指令下插入一对大括号
  • 控制从情节提要中的UIView中单击并拖动到
    ViewController.h
    ,并告诉它命名插座
    firstViewFirstSubView
现在我们有了
ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    IBOutlet UIView *firstViewFirstSubView;
}
@end
此时,我希望能够获得UIView子视图的尺寸。不过,我得到了所有0:

2012-11-15 15:21:00.743 StoryboardViewBounds[11132:c07] View Controller will appear. firstViewFirstSubView: <UIView: 0x9379730; frame = (0 0; 0 0); autoresize = TM+BM; layer = <CALayer: 0x9378e40>> 
2012-11-15 15:21:00.744 StoryboardViewBounds[11132:c07] subView's dimmensions: 0.000000 by 0.000000 at 0.000000, 0.000000
2012-11-15 15:21:00.743情节提要视图边界[11132:c07]视图控制器将出现。第一视图第一个子视图:
2012-11-15 15:21:00.744 StoryboardViewBounds[11132:c07]子视图的变暗:0.000000乘0.000000在0.000000,0.000000处

我做错了什么?看起来这应该很简单,所以我想我肯定错过了一些简单的东西,无论是在情节提要编辑器中抛出正确的开关,还是实现情节提要所需的方法。

这些维度是在调用
布局子视图时计算和设置的,出现在
视图之后的将出现
。在ui视图上调用
layoutSubviews
后,可以获得尺寸

请看如何在视图控制器中实现此方法:
viewdilayoutsubviews
。此时,您应该能够获得子视图的尺寸。请注意,此调用在iOS 5.0中开始可用,但由于您引用了故事板,因此我假设您的工作级别为或高于此级别

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    NSLog(@"View Controller did layout subviews. firstViewFirstSubView: %@ ", firstViewFirstSubView);
    NSLog(@"subView's dimmensions: %f by %f at %f, %f", firstViewFirstSubView.frame.size.width,
      firstViewFirstSubView.frame.size.height,
      firstViewFirstSubView.frame.origin.x,
      firstViewFirstSubView.frame.origin.y);
}

我不得不解决一个相关的问题,希望能为其他人节省一天的调试时间:

我在故事板中发现:

  • segue push
    不会导致
    子视图
    -viewdlayout子视图
    上进行布局(它们在
    -viewdid出现之前的某个时间进行布局)。
  • 分段模式
    [navController.storyboard presentViewController:
    是否会导致
    子视图
    -viewdilayoutsubviews
    中布局 解决方案是将
    [self.mySubView layoutSubviews]
    放在
    viewController
    -viewDidLayoutSubviews
    方法中,以便手动加载
    mySubView
    中的
    子视图

    我的情况是,我有一个自定义渐变按钮,没有正确初始化它的视觉外观。
    按钮包含在包含自定义渐变按钮的
    滚动视图
    中。
    滚动视图
    包含自定义渐变按钮。
    所以,基本上。。。
    滚动视图中视图内的按钮

    应用程序以一个
    UINavigationController
    开始,加载了一些其他
    ViewController1

    ViewController1
    包含一个按钮,按下该按钮时,会启动情节提要
    推至
    ViewController2

    (这是通过将控件从
    ViewController1
    中的按钮拖动到
    ViewController2
    来安排在情节提要中的)

    ViewController2
    包含
    滚动视图
    /
    自定义视图
    /
    自定义按钮

    ViewController2
    -viewdilayoutsubview
    中,我初始化了
    customButton
    ,这是一个自定义渐变按钮,它有自己的.h/.m文件。
    GradientButton.m
    有一个
    initLayers
    方法,该方法以图形方式对其进行配置,并要求初始化按钮的
    /
    frame
    属性。
    但是
    ViewController2
    -viewdilayoutsubview
    中,
    self.customButton
    的帧为0,0,0,0

    几点注意事项
  • 是的,我正在调用
    -viewdilayoutsubviews
    开头的
    [super-viewdilayoutsubviews]
  • -viewdilayoutsubviews
    上布置的唯一视图是
    self.view
    ViewController2
    的初始视图,在故事板的连接面板中连接。在我的例子中-
    self.view
    滚动视图
  • 解决:
  • ViewController2
    中,我为包含
    self.customButton
    的视图创建了一个outlet
    self.bottomView
  • ViewController2
    -viewdilayoutsubviews
    中,我调用
    [self.bottomView layoutSubviews]
    • 这将导致正确设置
      customButton
      的帧/边界
  • 接下来,我调用
    [self.customButton initLayers]
    ,它现在可以正确地初始化我的自定义渐变按钮 关于
    ViewController2
    -viewDidLayoutSubviews的几点注意事项:
  • 调用
    [self.view layoutSubviews]
    会初始化
    底部视图的框架,但不会初始化
    自定义按钮的框架
    
    - (void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
    
        NSLog(@"View Controller did layout subviews. firstViewFirstSubView: %@ ", firstViewFirstSubView);
        NSLog(@"subView's dimmensions: %f by %f at %f, %f", firstViewFirstSubView.frame.size.width,
          firstViewFirstSubView.frame.size.height,
          firstViewFirstSubView.frame.origin.x,
          firstViewFirstSubView.frame.origin.y);
    }