首先问题是这样的,我自定义了一个UIView,刚开始是在LayoutSubView的方法里先设置了子控件的frame,然后又根据最有一个子控件的大小设置整个frame的大小,代码如下:-(void) layoutSubviews
{
[self.productImgScrollView setFrame:CGRectMake(0, 0, DEVICE_WIDTH, DEVICE_WIDTH)];
[self.productNameLabel setFrame:CGRectMake(15, _productImgScrollView.frame.size.height+18, DEVICE_WIDTH-15*2, 18)];
[self.productPriceLabel setFrame:CGRectMake(15, self.productNameLabel.frame.origin.y+self.productNameLabel.frame.size.height+18, DEVICE_WIDTH-15*2, 18)];
if(self.product.discount!=nil)//有打折时
{
[self.productCountLabel setFrame:CGRectMake(15, self.productPriceLabel.frame.origin.y+self.productPriceLabel.frame.size.height+10, DEVICE_WIDTH-15*2, 13)];
[self createFeatureView:_productCountLabel.frame.origin.y+_productCountLabel.frame.size.height+20];
}else//无打折时
{
[self createFeatureView:_productPriceLabel.frame.origin.y+_productPriceLabel.frame.size.height+20];
}
//设置brandBar
[self createBrandToolBar:self.featureOne.frame.origin.y+self.featureOne.frame.size.height+20];
[self setFrame:CGRectMake(0, 0, DEVICE_WIDTH, self.brandToolBar.frame.origin.y+self.brandToolBar.frame.size.height)]; }
嗯,就是上面这个方法的最后一句,没有在initWithFrame这个方法中设置frame的大小。然后在ViewController里初始化这个自定义的视图(使用的是init方法,也没有设置frame的大小,因为考虑到在layoutsubview方法中已经把frame设置了),然后addSubview到控制器的视图中。但是在添加试图后,使用这个View的.frame.size方法得到的frame的size为(0,0)。此时视图可以正常显示,一切正常。
然后做了尝试,在自定义UIView的InitWithFrame方法中,对frame进行初始化,这是在控制器中是可以获得frame的size的大小的(也就是我在initWithFrame中设置的值),此时感觉问题应该是在我将自定义的view添加到控制器之后,打印frame的大小,此时可能还没有执行layoutsubview的方法,所以还没有设置frame的size的尺寸。
然后问题来了,我尝试在自定义View的initWithFrame和LayoutSubview的方法中都不设置frame的大小,此时,在控制其中,视图竟然也能正常显示,设置背景色显示正好是子控件的大小。
问题1:这里我没有设置frame的大小啊,怎么也能正常显示呢,在layoutsubview中打印frame的大小也是(0,0),这是怎么回事,是父视图可以根据子视图的尺寸自动调整大小吗?
问题2:如果我想根据子控件的位置及大小动态设置父视图的大小,在哪个方法中设置frame的尺寸呢?还是不设置显示都没有问题。
问题3:如果我在sublayoutSubView中设置frame的大小,那么我在控制器中什么时候才能得到执行完sublayuoutSubView这个方法后,frame的尺寸。
伊谢尔伦2017-04-18 09:55:49
"没有设置frame的大小啊,怎么也能正常显示呢"?
因为你在 layoutsubview
中设置子视图的frame是有固定高度的 比如 productPriceLabel
的宽高(DEVICE_WIDTH-15*2, 18)都是有值(即便self的size为{0,0})的。layoutsubview
中设置子视图的frame是有固定高度的 比如 productPriceLabel
的宽高(DEVICE_WIDTH-15*2, 18)都是有值(即便self的size为{0,0})的。
如果想根据子控件的位置及大小动态设置父视图的大小,那么也最好不要在layoutsubview
中设置 self
的frame。可以在子视图变化的时候去通知父视图的管理类(比如说你把父视图添加到ViewController的视图上,那就在控制器中调整父视图的frame)。
仍然是不建议在layoutsubview
中设置 self
的frame。另外控制器有个 viewDidLayoutSubviews
layoutsubview
中设置 self
的frame。可以在子视图变化的时候去通知父视图的管理类(比如说你把父视图添加到ViewController的视图上,那就在控制器中调整父视图的frame)。🎜🎜
🎜🎜仍然是不建议在layoutsubview
中设置 self
的frame。另外控制器有个 viewDidLayoutSubviews
方法。🎜🎜
🎜黄舟2017-04-18 09:55:49
问题1,还是没有搞明白。虽然我设置了子控件的尺寸,但是是加载在自定义控件上的,自定义控件没设置大小,为什么也可以呢?
问题2,我后来也是考虑了@馒头君的这个方法,但是因为之前是想在刚加载的时候就显示,所以有些代理方法是在加载之后才执行的,所以显示有问题。想到的方法是,将自定义控件的代理在viewContrllor中执行
问题3 我是用的是layoutIfNeed这个方法,下次尝试使用viewDidLayoutSubviews这个方法