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