在Storyboard中获取子视图的帧

Tod*_*sco 4 xcode ios uistoryboard

我只想(现在)在视图控制器的实例化中获取子视图的尺寸.

[这是一个简单的案例,我可以找到前一个问题.我试图弄清楚为什么故事板中的场景的子视图不像我期望的那样表现,也就是说:像XIB一样 - 我只想在实际绘制到屏幕之前获取子视图的尺寸]

为了将问题压缩到一个新的,干净的项目,我这样做:

  • 选中"使用Storyboard"创建一个新的单视图项目
  • 将单个UIView添加到默认的现有MainStoryboard_iPad.storyboard(并将其背景更改为绿色以使其更容易看到 - 除了缩小尺寸之外,这是我从默认的UIView中拖动到场景中的唯一更改)
  • 选项 - 单击ViewController.h导航器中的文件,将其放在Storyboard框架下面的自己的框架中,并在@interface指令下面插入一对括号
  • 从故事板中的UIView进行控制 - 单击并拖动,ViewController.h并告诉它命名插座firstViewFirstSubView

所以我们现在有ViewController.h:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    IBOutlet UIView *firstViewFirstSubView;
}
@end
Run Code Online (Sandbox Code Playgroud)

然后,我将此方法添加到ViewController.m:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    NSLog(@"View Controller will appear. 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);
}
Run Code Online (Sandbox Code Playgroud)

此时,我希望能够获得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
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?看起来这应该是非常简单的,所以我认为我必须遗漏一些简单的东西,无论是在Storyboard编辑器中抛出正确的开关还是实现Storyboard需要的方法.

fog*_*lla 8

这些维度是在进行调用时计算和设置的layoutSubviews,这发生在之后viewWillAppear.在layoutSubviewsUIVIew上调用后,您可以获得尺寸.

看看在视图控制器中实现此方法:viewDidLayoutSubviews.此时,您应该能够获得子视图的尺寸.请注意,此调用从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);
}
Run Code Online (Sandbox Code Playgroud)


Obj*_*eTC 8

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

我在故事板中发现了这一点:

  1. segue-push不会引起subViews到在被解雇了-viewDidLayoutSubviews(他们是不是在其他时间之前布局-viewDidAppear).
    ......
  2. segue-modal[navController.storyboard presentViewController:] 不会导致subViews在被解雇了-viewDidLayoutSubviews.

解决的办法是把[self.mySubView layoutSubviews]所述内viewController-viewDidLayoutSubviews方法,以手动加载subView内小号mySubView.

我的情况是我有一个自定义渐变按钮,没有正确初始化它的视觉外观.
按钮载内的scrollView含有一个CustomView含有自定义梯度按钮.
所以,基本上......一个视图中的一个按钮scrollView.

该应用程序开始时UINavigationController有一些其他ViewController1加载.
ViewController1包含一个按钮,按下时,将启动一个故事板segue-pushViewController2.
(这是由控制拖动在从按钮布置在故事板ViewController1ViewController2).

ViewController2包含scrollview/ customView/ customButton.
ViewController2s中-viewDidLayoutSubviews,我初始化了customButton一个自定义渐变按钮,它有自己的.h/.m文件.
GradientButton.m有一个initLayers方法,以图形方式配置它,并要求初始化按钮的bounds/ frame属性.
然而 ......
ViewController2's中-viewDidLayoutSubviews,self.customButton有一个0,0,0,0的框架.

几点说明:

  1. 是的,我[super viewDidLayoutSubviews]在开始时打电话-viewDidLayoutSubviews.
  2. 已经列出的唯一视图-viewDidLayoutSubviewsself.view(ViewController2初始视图,在Storyboard的连接面板self.viewscrollView连接.在我的情况下 - 是一个).

解决:

  1. ViewController2,我self.bottomView为包含的视图创建了一个出口self.customButton.
  2. ViewController2-viewDidLayoutSubviews,我打电话[self.bottomView layoutSubviews]
    • 这将导致customButton正确设置帧/边界.
  3. 接下来,我调用[self.customButton initLayers]现在正确初始化我的自定义渐变按钮.

约了几个音符ViewController2-viewDidLayoutSubviews:调用[self.view layoutSubviews]原因bottomView的框架进行初始化,但不是customButton的框架.
就视图层次结构而言,-layoutSubviews仅适用于subViews self.view而不是subViews中的任何subViews.
这只是故事板的情况segue-push.

故事板segue-modal和方案[navController presentViewController]似乎都正确初始化视图层次的所有级别(所有的" subViewS的subView通过时间的")-viewDidLayoutSubviews之称.