在XCode4.5中,我使用storyboard创建一个UIScrollView对象,在viewDidLoad:方法中得到它的frame的值都是0,但是我在storyboard中都设置了UIScrollView对象的frame的属性值的。
我的目的是使用UIScrollView和UIPageController实现翻页,在viewDidLoad:方法中创建新增的页面,而页面的体积是根据scrollview的frame的size来获取。现在size为0了,新建的页面对象也就跟着为0了。在运行时不显示出来,也就没办法翻页。
一开始我并不知道这是scrollview的frame的问题,debug后发现问题。
因此,我做了一个简单的测试。
我再创建一个基于storyboard的简单视图项目,然后拖一个UIView对象进来,设置它的背景色为绿色,frame也设置一个合适的大小,反正不是(0,0,0,0)。(注意,我没有使用UIScrollView,而是使用UIView,测试性质是一样的)然后,在storyboard中按住control键,点击UIView对象,拖到ViewController.h中,设置outlet,命名为firstViewFirstSubView。
我在ViewController.m中重写 viewDidLoad:方法,原来就是在此方法中新建的翻页页面视图对象。
- (void),viewDidLoad:(BOOL)animated
{
[super ,viewDidLoad:animated];
NSLog(@"View Controller Did Load. 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);
}
测试结果不出所料,该uiview.frame的所有的值都是0.
2012-11-15 15:21:00.743 StoryboardViewBounds[11132:c07] View Controller Did Load. 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
视图控制器类一共有四个方法可以重写来实现视图加载和展现,分别是ViewWillAppear:,viewDidAppear:,viewDidLoad:,viewDidLayoutSubviews。其中viewDidLayoutSubviews方法是在iOS5.0系统中才开始提供的。
在ViewWillAppear:方法,该uiview.frame的所有的值还是0.
但在viewDidAppear:和viewDidLayoutSubviews中,得到的frame的值就是storyboard中设置的值了。
这是为什么呢?需要了解一下视图控制器的工作原理了。
视图在视图控制器的生命周期中加载和展现流程如下图所示:
在viewDidLoad之前,视图控制器的作为view的outlet不和storyboard连接,直到viewWillAppear时,view的体积才被设置。
这个view的所有维度在layoutSubviews时会被计算和设置,但layoutSubviews是发生在viewWillAppear。
因此,在layoutSubviews之后,才能得到这个view设置在storyboard中的所有维度值。
相关推荐
我已经使用Storyboard为iPhone 5s创建了这个库。 现在,您可以将此PullOverView用作android提供。 (void)viewDidLoad {[super viewDidLoad]; CGFloat xOffset = 0; pullUpView = [[StyledPullableView alloc] ...
Storyboard.SetTarget(result, view); Storyboard.SetTargetProperty(result, new PropertyPath("Camera.Position")); return result; } private DoubleAnimation GetRotateAnimation(double fromDegree, ...
1、初始化 drawMarqueeView = WQScrollLabelView(frame: CGRect(x: 0, y: 104, width: self.view.bounds.width, height: 20)) 2、设置属性 drawMarqueeView.marqueeDirection = .left view.addSubview...
通过拖动UIView并更改类或在代码中创建它,在Storyboard中创建控件,如下所示: let startWidth = self . view . frame . width * 0.1 let startHeight = self . view . frame . height * 0.1 let ...
在OC开发中,Storyboard中的所有操作都可以通过代码实现,程序员一定要熟练掌握代码布局界面的能力! 设置控件监听方法的示例代码如下: 代码如下: [btn addTarget:self action:@selector(click:) forControlEvents...
CALayer-AutoresizingMask 为 iOS CALayer 添加 UIViewAutoresize 支持和快速 UIView 到 CALayer 的转换方法 ... 增加origin和size的self.frame proportionaly至superview小号frame增量通过在每个轴的柔
只需将UIView添加到您的.storyboard中,然后将自定义类设置为IconLabelView 以编程方式 let iconLabelView = IconLabelView ( frame : CGRect ( x : 20 , y : 100 , width : 300 , height : 35 )) iconLabelView. ...
iOS开发中,创建View常见的两种方式一个是纯代码,一个是借助于XIB;创建ViewController常见的也有两种方式一个是纯代码,一个是借助于StoryBoard。 通过交流我发现很多童鞋对这些概念都很模糊,于是通过实验写一篇...
并不针对约束的使用说明,是演示从约束到布局生效过程,通过约束来改变view的大小并产生动画改变。 同时也展示了 ScrollView 的正确约束使用方式,通过正确的约束使superView根据subviews的大小自动改变自己的frame...
源码SkyCalendarPriceView,一个可以自定义样式的价格日历,高度封装,简单使用,传入对应的数据...可在Xib或StoryBoard中拖拽使用,也支持自动布局,也可以手写固定的Frame 支持旋屏 测试环境:Xcode 6,iOS 7.0以上